forgecad 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{AdminPage-jwoEgwE_.js → AdminPage-Da6hhpJx.js} +1 -1
- package/dist/assets/{BlogPage-Ck7g3ue2.js → BlogPage-Bl_sKeWb.js} +1 -1
- package/dist/assets/{DocsPage-9WaRC14b.js → DocsPage-Blz3Tp4j.js} +1 -6
- package/dist/assets/EditorApp-CuiPbtn5.js +12754 -0
- package/dist/assets/{EmbedViewer-37_PfMwv.js → EmbedViewer-BFG6-Ufm.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-CO8WL0CY.js → LandingPageProofDriven-DB9fQd5P.js} +1 -1
- package/dist/assets/{PricingPage-DADKGuOa.js → PricingPage-BMxYT_F0.js} +1 -1
- package/dist/assets/{SettingsPage-DKKI4W49.js → SettingsPage-VVQNrCAg.js} +1 -1
- package/dist/assets/{app-CwI02pTA.js → app-Dl9ymBWC.js} +355 -36
- package/dist/assets/cli/{render-Kw5hLEcL.js → render-CFtwKCCY.js} +203 -862
- package/dist/assets/{sectionPlaneMath-C8N0w8o3.js → distance-BEC2RjJi.js} +4150 -801
- package/dist/assets/{evalWorker-D6ub3kfS.js → evalWorker-CRvbzTXm.js} +2611 -528
- package/dist/assets/{manifold-CwDdMKyc.js → manifold-B9QSr-qP.js} +1 -1
- package/dist/assets/{manifold-DTvmxSDf.js → manifold-DpBXFS2K.js} +1 -1
- package/dist/assets/{manifold-lru0jwVw.js → manifold-DzZ4VRPs.js} +2 -2
- package/dist/assets/{renderSceneState-tvtNKNRi.js → renderSceneState-BuAXF2jh.js} +1 -1
- package/dist/assets/{reportWorker-DeqktDGt.js → reportWorker-BNWEnRg1.js} +2606 -525
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +0 -1
- package/dist/docs-raw/API/core/concepts.md +11 -1
- package/dist/docs-raw/CLI.md +64 -13
- package/dist/docs-raw/beta-operations.md +4 -0
- package/dist/docs-raw/deployment.md +38 -23
- package/dist/docs-raw/generated/assembly.md +8 -3
- package/dist/docs-raw/generated/concepts.md +126 -46
- package/dist/docs-raw/generated/core.md +97 -47
- package/dist/docs-raw/generated/curves.md +113 -595
- package/dist/docs-raw/generated/lib.md +40 -3
- package/dist/docs-raw/generated/output.md +6 -1
- package/dist/docs-raw/generated/sdf.md +50 -4
- package/dist/docs-raw/generated/sketch.md +9 -1
- package/dist/docs-raw/generated/viewport.md +1 -9
- package/dist/docs-raw/guides/inspection-bundles.md +40 -9
- package/dist/docs-raw/runbook.md +3 -3
- package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -0
- package/dist/docs-raw/skills/forgecad-image-replicator.md +3 -1
- package/dist/docs-raw/skills/forgecad-make-a-model.md +48 -4
- package/dist/docs-raw/skills/forgecad-render-inspect.md +3 -1
- package/dist/docs-raw/skills/forgecad-visual-spec.md +2 -0
- package/dist/docs-raw/skills/forgecad.md +2 -1
- package/dist/docs-raw/skills/index.md +0 -1
- package/dist/index.html +1 -1
- package/dist/sitemap.xml +6 -6
- package/dist-cli/blender/render.py +43 -8
- package/dist-cli/forgecad.js +5729 -2015
- package/dist-cli/forgecad.js.map +1 -1
- package/dist-skill/CONTEXT.md +372 -667
- package/dist-skill/SKILL-dev.md +2 -1
- package/dist-skill/SKILL.md +2 -1
- package/dist-skill/docs/API/core/concepts.md +11 -1
- package/dist-skill/docs/CLI.md +64 -13
- package/dist-skill/docs/generated/assembly.md +8 -3
- package/dist-skill/docs/generated/core.md +97 -47
- package/dist-skill/docs/generated/curves.md +113 -595
- package/dist-skill/docs/generated/lib.md +40 -3
- package/dist-skill/docs/generated/output.md +6 -1
- package/dist-skill/docs/generated/sdf.md +50 -4
- package/dist-skill/docs/generated/sketch.md +9 -1
- package/dist-skill/docs/generated/viewport.md +1 -9
- package/dist-skill/docs/guides/inspection-bundles.md +40 -9
- package/dist-skill/docs-dev/API/core/concepts.md +11 -1
- package/dist-skill/docs-dev/CLI.md +64 -13
- package/dist-skill/docs-dev/generated/assembly.md +8 -3
- package/dist-skill/docs-dev/generated/core.md +97 -47
- package/dist-skill/docs-dev/generated/curves.md +113 -595
- package/dist-skill/docs-dev/generated/lib.md +40 -3
- package/dist-skill/docs-dev/generated/output.md +6 -1
- package/dist-skill/docs-dev/generated/sdf.md +50 -4
- package/dist-skill/docs-dev/generated/sketch.md +9 -1
- package/dist-skill/docs-dev/generated/viewport.md +1 -9
- package/dist-skill/docs-dev/guides/inspection-bundles.md +40 -9
- package/dist-skill/library/README.md +0 -1
- package/dist-skill/library/forgecad-blockout-model/SKILL.md +1 -0
- package/dist-skill/library/forgecad-image-replicator/SKILL.md +3 -1
- package/dist-skill/library/forgecad-make-a-model/SKILL.md +48 -4
- package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
- package/dist-skill/library/forgecad-visual-spec/SKILL.md +2 -0
- package/examples/api/drive-wheel-regions.forge.js +43 -0
- package/examples/api/guided-loft-olive-oil-bottle.forge.js +135 -0
- package/examples/api/sdf-circular-array-knurling.forge.js +19 -0
- package/examples/api/sdf-pattern2d-ceramic-ripple-set.forge.js +83 -0
- package/examples/api/sdf-pattern2d-grip-tread.forge.js +72 -0
- package/examples/api/sdf-pattern2d-orbital-jewelry.forge.js +62 -0
- package/examples/api/sdf-surface-basket-weave.forge.js +67 -0
- package/examples/api/sector-gear-body.forge.js +34 -0
- package/package.json +20 -2
- package/dist/assets/EditorApp-Dja2jMmW.js +0 -12509
- package/dist/docs-raw/skills/forgecad-api-dogfood.md +0 -130
- package/dist-skill/library/forgecad-api-dogfood/SKILL.md +0 -125
|
@@ -28,7 +28,7 @@ import sys
|
|
|
28
28
|
import json
|
|
29
29
|
import math
|
|
30
30
|
import os
|
|
31
|
-
from mathutils import Vector
|
|
31
|
+
from mathutils import Matrix, Vector
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
# ---------------------------------------------------------------------------
|
|
@@ -414,18 +414,26 @@ def setup_camera(config, objects):
|
|
|
414
414
|
|
|
415
415
|
cam_config = config.get('camera') or {}
|
|
416
416
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
417
|
+
projection_mode = cam_config.get('projectionMode') or cam_config.get('type') or 'perspective'
|
|
418
|
+
if projection_mode == 'orthographic':
|
|
419
|
+
cam_data.type = 'ORTHO'
|
|
420
|
+
if cam_config.get('orthoScale'):
|
|
421
|
+
cam_data.ortho_scale = float(cam_config['orthoScale'])
|
|
422
|
+
elif cam_config.get('orthoZoom'):
|
|
423
|
+
cam_data.ortho_scale = 960.0 / float(cam_config['orthoZoom'])
|
|
424
|
+
else:
|
|
425
|
+
cam_data.ortho_scale = 960.0
|
|
426
|
+
else:
|
|
427
|
+
cam_data.type = 'PERSP'
|
|
428
|
+
fov = cam_config.get('fov', 45)
|
|
429
|
+
cam_data.lens_unit = 'FOV'
|
|
430
|
+
cam_data.angle = math.radians(fov)
|
|
421
431
|
|
|
422
432
|
if cam_config.get('position') and cam_config.get('target'):
|
|
423
433
|
pos = Vector(cam_config['position'])
|
|
424
434
|
target = Vector(cam_config['target'])
|
|
425
435
|
cam_obj.location = pos
|
|
426
|
-
|
|
427
|
-
rot_quat = direction.to_track_quat('-Z', 'Y')
|
|
428
|
-
cam_obj.rotation_euler = rot_quat.to_euler()
|
|
436
|
+
set_camera_orientation(cam_obj, pos, target, cam_config.get('up'))
|
|
429
437
|
else:
|
|
430
438
|
# Auto-frame: compute bounding box of all mesh objects
|
|
431
439
|
auto_frame_camera(cam_obj, objects)
|
|
@@ -433,6 +441,33 @@ def setup_camera(config, objects):
|
|
|
433
441
|
return cam_obj
|
|
434
442
|
|
|
435
443
|
|
|
444
|
+
def set_camera_orientation(cam_obj, pos, target, up_values=None):
|
|
445
|
+
direction = target - pos
|
|
446
|
+
if direction.length <= 1e-8:
|
|
447
|
+
return
|
|
448
|
+
|
|
449
|
+
if up_values:
|
|
450
|
+
forward = direction.normalized()
|
|
451
|
+
up = Vector(up_values)
|
|
452
|
+
if up.length > 1e-8:
|
|
453
|
+
up.normalize()
|
|
454
|
+
right = up.cross(forward)
|
|
455
|
+
if right.length > 1e-8:
|
|
456
|
+
right.normalize()
|
|
457
|
+
true_up = forward.cross(right)
|
|
458
|
+
true_up.normalize()
|
|
459
|
+
rotation = Matrix((
|
|
460
|
+
(right.x, true_up.x, -forward.x),
|
|
461
|
+
(right.y, true_up.y, -forward.y),
|
|
462
|
+
(right.z, true_up.z, -forward.z),
|
|
463
|
+
))
|
|
464
|
+
cam_obj.rotation_euler = rotation.to_euler()
|
|
465
|
+
return
|
|
466
|
+
|
|
467
|
+
rot_quat = direction.to_track_quat('-Z', 'Y')
|
|
468
|
+
cam_obj.rotation_euler = rot_quat.to_euler()
|
|
469
|
+
|
|
470
|
+
|
|
436
471
|
def auto_frame_camera(cam_obj, objects):
|
|
437
472
|
"""Position camera to frame all objects nicely — iso view."""
|
|
438
473
|
if not objects:
|