"Great customer service. The folks at Novedge were super helpful in navigating a somewhat complicated order including software upgrades and serial numbers in various stages of inactivity. They were friendly and helpful throughout the process.."
Ruben Ruckmark
"Quick & very helpful. We have been using Novedge for years and are very happy with their quick service when we need to make a purchase and excellent support resolving any issues."
Will Woodson
"Scott is the best. He reminds me about subscriptions dates, guides me in the correct direction for updates. He always responds promptly to me. He is literally the reason I continue to work with Novedge and will do so in the future."
Edward Mchugh
"Calvin Lok is “the man”. After my purchase of Sketchup 2021, he called me and provided step-by-step instructions to ease me through difficulties I was having with the setup of my new software."
Mike Borzage
August 22, 2025 5 min read

FormZ, once celebrated mainly for its intuitive push-pull modeling, now offers a robust Python 3.x interface that invites **speed, precision, and innovation**. This post targets intermediate and advanced users who wish to harness that interface and evolve from talented modelers into computational designers.
The first obstacle is rarely geometry—it's mindset. Python is a multi-paradigm language, yet FormZ’s API rewards clean, object-oriented design that mirrors the application’s own data hierarchy.
Understand the namespaces. On launch, FormZ exposes three primary modules:
fz (core geometry and document access), fzui (dialogs, widgets, palettes), and fzmath (vectors, matrices, quaternions). Treat them as you would any other Python packages; import only what is needed to keep the script footprint small.
Map operations to classes. A modeling operation such as “Resolve Face” becomes fz.Face.resolve(). A layer is a fz.Layer instance, a viewport is a fz.View. Write short exploratory snippets in the script console:
from fz import Document
doc = Document.active()
for obj in doc.objects:
print(obj.name, obj.layer.name)
Adopt modular habits. Break script logic into functions—def orient_profile(...):— or encapsulate related behaviors inside classes. Organize recurring utilities in a dedicated site-packages/fzlib folder so every new project can import with a single line.
Stay modern with tooling. A virtual environment isolates dependencies (NumPy, SciPy) while an IDE such as VS Code offers IntelliSense, linting through Pylint, and breakpoint debugging through debugpy. The outcome is fewer syntax errors and dramatically faster prototyping.
python -m venv fz_env
pip install numpy scipy debugpy
A grand script that builds façades, populates furnishings, and exports render passes sounds compelling, but maintainability lives in small victories. Aim first at single pain points that take you away from design thinking.
Spot the low-hanging fruit. Layer renaming, material reassignment after an OBJ import, or repetitive viewport creation for documentation each steals minutes that accumulate into hours. For every irritation, draft a micro-automation whose entire logic fits on one screen.
Example: renaming every layer that ends with “_mesh” to “_subd” for clarity.
from fz import Document
doc = Document.active()
for layer in doc.layers:
if layer.name.endswith('_mesh'):
layer.name = layer.name[:-5] + '_subd'
Validate incrementally. Instead of running a 400-line macro and hoping for the best, execute 10 lines, inspect the scene, then move forward. In the console, the variable _ recalls the last result; use it to probe returns quickly.
When multiple micro-automations show measurable success—e.g., 70 % reduction in mouse clicks—you can chain them:
rename_layers(), assign_pbr_materials(), build_cameras().time.perf_counter() to detect bottlenecks.prep_scene() that invokes each subroutine sequentially or conditionally.The philosophy is to earn complexity; macro-workflows should be built only on rock-solid, performance-vetted foundations.
FormZ’s hybrid kernel mixes boundary representation, CSG, NURBS, and subdivision; the API exposes that richness without forcing the designer into a single paradigm.
CSG and boolean reliability. Instead of performing booleans manually, call fz.CSG.union(obj_a, obj_b) inside loops that iterate over algorithmically placed primitives. Because the operation occurs in memory before viewport redraw, larger datasets are processed faster.
Parameterized inputs. Interactive sliders created via fzui.Slider or external JSON parameter files bind a value not only to the first execution but to every subsequent regeneration, supporting design exploration. For quick prototypes:
import json, fz
with open('tower_params.json') as f:
params = json.load(f)
radius = params['core_radius']
floors = params['floor_count']
Integrate mathematical libraries. Bring in NumPy and SciPy when native utilities fall short. A double-helix staircase, for example, emerges from a parametric equation applied to an array; vectorization delivers both elegance and speed:
import numpy as np
angles = np.linspace(0, 4*np.pi, 200)
x = np.cos(angles) * radius
y = np.sin(angles) * radius
z = np.linspace(0, height, 200)
for xi, yi, zi in zip(x, y, z):
step = fz.Primitive.cylinder(radius=step_r, height=step_h)
step.translate((xi, yi, zi))
doc.add(step)
Maintain intent with constraints. Build a dependency graph where each child object listens to parent transforms. If a core shaft radius updates, every mullion, bracket, or glass panel adjusts without manual nudging. Combine Python observers with FormZ’s built-in “Follow Animation” feature to track parameter evolution over time.
doc.recompute() once after bulk updates instead of per object.Geometry is powerful, but data is connective tissue. By treating FormZ as a node in a broader ecosystem—rather than a silo—you avoid duplicated effort and exploit external intelligence.
Direct IO of external formats. The API exposes fz.io.export() and fz.io.import_() that bypass UI dialogs. A fabrication team requesting STEP can receive nightly builds from an automated script, while visualization can pull an OBJ ready for texturing in Modo.
Metadata extraction and transformation. When an IFC arrives, parse property sets and populate FormZ attributes, enabling automatic BOM creation or coordination views. Conversely, export a CSV schedule by iterating over keyed attributes:
import csv
with open('schedule.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['ID', 'Name', 'Volume'])
for obj in doc.objects:
writer.writerow([obj.id, obj.name, obj.volume])
REST APIs and databases. Suppose a parametric façade must respond to real-time solar data. Query a weather API, push the sun vector into the model, and regenerate shading fins every hour:
import requests, datetime, fz
response = requests.get('https://api.solardata.io/now?lat=40.7&lon=-74.0').json()
sun_vec = fzmath.Vector3(response['x'], response['y'], response['z'])
update_shading(sun_vec)
Embed version control hooks. A pre-commit script can call fz.Document.save('rev_'+sha+'.fmz') and dot-tag objects with the commit hash. The repository then contains both code and the exact model state that produced an image or CNC output, aligning geometry provenance with software best practices.
Elegant code counts, yet a script that lags becomes shelf-ware. Performance tuning should accompany every stage of maturation, and so should the packaging needed for team adoption.
Profile intelligently. Use cProfile.run('main()') to expose slow functions. FormZ’s own log panel timestamps operations; compare those against Python metrics to detect whether the bottleneck is API or algorithm.
Refactor loops. Many geometry routines iterate thousands of times. Where operations are associative and free of shared state, Python’s multiprocessing or concurrent.futures can push execution onto multiple cores. For vector math, a single NumPy operation often replaces dozens of Python-level loops.
ProcessPoolExecutor, measure, then finalize.Document with purpose. Adhere to docstrings that explain intent, not just mechanics. Type hints (def bevel(edge: fz.Edge, radius: float) -> fz.Object) feed IDE auto-completion and reduce misuse by teammates unfamiliar with a function’s expectation.
Package as plug-ins. When a script stabilizes, wrap it into a plug-in: create a manifest XML, design an SVG icon, map the command into the “Extensions” menu, and sign it for deployment across the studio. A shared codebase means every designer benefits from the latest fix the moment it lands in the repository.
By uniting **foundational Python skills** with micro-automations, deep kernel access, and robust data exchange, a FormZ user transcends the limitations of manual modeling. Performance profiling, documentation discipline, and packaging ensure those gains propagate across teams. Scripting does more than accelerate the familiar; it recasts FormZ as an open-ended platform ready for generative, data-driven futures.

November 10, 2025 2 min read
Read More
November 10, 2025 2 min read
Read More
November 10, 2025 2 min read
Read MoreSign up to get the latest on sales, new releases and more …