devagent-ignition 0.1.7__tar.gz → 0.1.8__tar.gz

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.
Files changed (134) hide show
  1. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/PKG-INFO +1 -1
  2. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/SHA256SUMS.txt +2 -2
  3. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/three_scene.js +22 -8
  4. devagent_ignition-0.1.8/devagent_spatial/__init__.py +1 -0
  5. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/pyproject.toml +1 -1
  6. devagent_ignition-0.1.7/devagent_spatial/__init__.py +0 -1
  7. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/.gitignore +0 -0
  8. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/README.md +0 -0
  9. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/RELEASE_MANIFEST.json +0 -0
  10. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/SOURCE_PROVENANCE.json +0 -0
  11. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/agent.js +0 -0
  12. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator.css +0 -0
  13. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_2d.mjs +0 -0
  14. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_original_r9.mjs +0 -0
  15. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_original_v8.mjs +0 -0
  16. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_r9_diagnostics.mjs +0 -0
  17. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_scene.mjs +0 -0
  18. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/creator_ui.mjs +0 -0
  19. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/customer_documents.js +0 -0
  20. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/equipment_controls.mjs +0 -0
  21. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/facility2d.css +0 -0
  22. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/facility2d_app.mjs +0 -0
  23. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/facility2d_core.mjs +0 -0
  24. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/facility2d_simulation.mjs +0 -0
  25. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/facility2d_viewer.html +0 -0
  26. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/fallback_scene.js +0 -0
  27. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/flow_geometry.mjs +0 -0
  28. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/harness.js +0 -0
  29. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/live_design_review.js +0 -0
  30. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/operations_ui.js +0 -0
  31. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/operator_viewer.html +0 -0
  32. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/project_package.js +0 -0
  33. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/r9_transport.mjs +0 -0
  34. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/runtime_feed.js +0 -0
  35. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/studio.html +0 -0
  36. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/style.css +0 -0
  37. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/test_workspace.html +0 -0
  38. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/unified_engineer.js +0 -0
  39. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/v076_fat_ui.js +0 -0
  40. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/v078_command_ui.js +0 -0
  41. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/viewer.html +0 -0
  42. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/assets/viewer.js +0 -0
  43. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/design-system.json +0 -0
  44. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_hmi.py +0 -0
  45. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/agent_harness.py +0 -0
  46. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/agent_runtime.py +0 -0
  47. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/contract_opc_fat.py +0 -0
  48. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/contract_opc_source.py +0 -0
  49. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/control_intents.py +0 -0
  50. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/customer_intake.py +0 -0
  51. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/engineering_expertise.py +0 -0
  52. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/generator.py +0 -0
  53. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/ignition_native.py +0 -0
  54. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/ignition_project.py +0 -0
  55. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/industrial_templates.py +0 -0
  56. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/live_lab_binding.py +0 -0
  57. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/model.py +0 -0
  58. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/native_reference.py +0 -0
  59. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/opc_snapshot.py +0 -0
  60. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/operations.py +0 -0
  61. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/operations_capture.py +0 -0
  62. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/operations_lab.py +0 -0
  63. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/original_r9.py +0 -0
  64. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/original_v8.py +0 -0
  65. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/preflight.py +0 -0
  66. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/preview_simulation.py +0 -0
  67. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/project_package.py +0 -0
  68. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/qualification.py +0 -0
  69. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/strict_json.py +0 -0
  70. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/studio.py +0 -0
  71. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/studio_workflow.py +0 -0
  72. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/test_reporting.py +0 -0
  73. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v076_opc_fat.py +0 -0
  74. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v078_commands.py +0 -0
  75. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v078_native_commands.py +0 -0
  76. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v07_fat.py +0 -0
  77. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v07_native.py +0 -0
  78. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/devagent_spatial/v083_native.py +0 -0
  79. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/CV101-command-contract-PENDING.json +0 -0
  80. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/cv101_guided.json +0 -0
  81. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/make_examples.py +0 -0
  82. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/single_floor.json +0 -0
  83. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/v0771_training_wizard.json +0 -0
  84. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/warehouse-3floor-standard-2d.json +0 -0
  85. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/warehouse-operations-synthetic.json +0 -0
  86. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/warehouse-v07-lab-bindings-PENDING.json +0 -0
  87. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/warehouse.json +0 -0
  88. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/examples/water.json +0 -0
  89. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/REFERENCE_SHA256.json +0 -0
  90. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/app.mjs +0 -0
  91. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/index.html +0 -0
  92. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/lab_panel.mjs +0 -0
  93. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/model.mjs +0 -0
  94. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/state_adapter.mjs +0 -0
  95. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-golden/web/styles.css +0 -0
  96. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/README_R9.md +0 -0
  97. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/SHA256SUMS.txt +0 -0
  98. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/SNAPSHOT_SHA256SUMS.txt +0 -0
  99. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/flow_routes.json +0 -0
  100. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/flow_sim.py +0 -0
  101. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/lab_control.py +0 -0
  102. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/app.mjs +0 -0
  103. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/index.html +0 -0
  104. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/lab_panel.mjs +0 -0
  105. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/model.mjs +0 -0
  106. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/state_adapter.mjs +0 -0
  107. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/styles.css +0 -0
  108. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/vendor/LICENSE-three.txt +0 -0
  109. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/vendor/SHA256SUMS.txt +0 -0
  110. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/vendor/addons/controls/OrbitControls.js +0 -0
  111. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/vendor/three.core.js +0 -0
  112. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/r9-original/web/vendor/three.module.js +0 -0
  113. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/README.md +0 -0
  114. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/SHA256SUMS.txt +0 -0
  115. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/model.py +0 -0
  116. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/run_demo.sh +0 -0
  117. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/server.py +0 -0
  118. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/tests/browser_smoke.py +0 -0
  119. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/tests/test_v8.py +0 -0
  120. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/topology.json +0 -0
  121. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/web/app.js +0 -0
  122. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/web/index.html +0 -0
  123. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/web/simulator.html +0 -0
  124. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/web/simulator.js +0 -0
  125. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/reference/v8-original/web/style.css +0 -0
  126. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/sample_customer_inputs/Plant_Equipment_Register.csv +0 -0
  127. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/sample_customer_inputs/Plant_Flow_Requirements.txt +0 -0
  128. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/sample_customer_inputs/Raw_PLC_Tag_Export.csv +0 -0
  129. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/warehouse_connections.csv +0 -0
  130. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/warehouse_equipment.csv +0 -0
  131. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/warehouse_signals.csv +0 -0
  132. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/water_connections.csv +0 -0
  133. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/water_equipment.csv +0 -0
  134. {devagent_ignition-0.1.7 → devagent_ignition-0.1.8}/templates/water_signals.csv +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: devagent-ignition
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: Offline industrial HMI engineering and Ignition Perspective candidate tools (production deployment not qualified)
5
5
  Project-URL: Repository, https://github.com/tomha85/devagent-ignition
6
6
  Project-URL: Documentation, https://github.com/tomha85/devagent-ignition#readme
@@ -28,7 +28,7 @@ c6b47941a2ffe72d297d329899b252f898904a0f37c1592689eeb81e0815147c assets/runtime
28
28
  6f0dcc9f218455b708552daa0536b2afb2d68b4095a1a6956f2147c329a6ff2f assets/studio.html
29
29
  c9f87624386bbe84ab7d71f93708f00f91a69e0d9693738cfee51913e5831fdf assets/style.css
30
30
  fd0d07ddec872de25c4e485573d5aa5b0c7a2c3137a93e65c6406b637fad7ad7 assets/test_workspace.html
31
- 061444f56a0b201a9089fc174507608c965302ab830a7af0da102ba9849a6b71 assets/three_scene.js
31
+ 1463a628e50ba2f355e621372386777cd5d03c0c07aaec351e468c68ae9fc1dc assets/three_scene.js
32
32
  af23f86ef51e18dfc94355e77fe9fb52570db14466d05d6dadededf17458fe25 assets/unified_engineer.js
33
33
  531c378fe3aae0c1d0686da48d7a4eba371ca7641b343b952dc8448f1cf65dc1 assets/v076_fat_ui.js
34
34
  d009f79a79ed1278911c81818b97a7dbce72464b599bb00f6116b81e1b1f9b5c assets/v078_command_ui.js
@@ -39,7 +39,7 @@ d009f79a79ed1278911c81818b97a7dbce72464b599bb00f6116b81e1b1f9b5c assets/v078_co
39
39
  7ca0cdaea16239fc543fa63a5079fe40e4192c5281dc88085c5959ea5f350359 DESIGN_STANDARD_V1.md
40
40
  54ee77ca35589b06bd093204c9e5b28eabb69a8b2158ef1be5897386d3676c3f design-system.json
41
41
  287744606d4ec09533bb0af2ab6c1e059e614a7d87bc8c365d0f1e16c646bff8 devagent_hmi.py
42
- 9856341b0c2e37e6b733cc3ddff9ac912e86648beff5235d8cb7c969636c9be2 devagent_spatial/__init__.py
42
+ aeae4e316fa4871428ff9140bd2acf6804b59517c6f5a1b6852ba8f8a2b661f9 devagent_spatial/__init__.py
43
43
  a6b1a2a97e2ec31e2de7f4c576b9482f66d3aa7fb356b06f0475bcd221dd8116 devagent_spatial/agent_harness.py
44
44
  a54c22bb64e5ff6b8d720bc44a73d851388f3f55adcba0f5f17098349895f2a4 devagent_spatial/agent_runtime.py
45
45
  f57e58f596ab5395b5a9692158cca43866de32ec9f8d07bdec363a36610e3d2b devagent_spatial/contract_opc_fat.py
@@ -47,7 +47,7 @@ export async function startThree(model,host,onSelect){
47
47
  highlight:new T.MeshStandardMaterial({color:0xd6b66e,metalness:.54,roughness:.42}),
48
48
  };
49
49
  const mat=(c,metal=.48,rough=.48,opacity=1)=>new T.MeshStandardMaterial({color:c,metalness:metal,roughness:rough,transparent:opacity<1,opacity,side:T.DoubleSide});
50
- const assets=new Map(),pickables=[],floors=new Map(),sensorLamps=new Map();
50
+ const assets=new Map(),pickables=[],floors=new Map(),sensorLamps=new Map(),assetLabels=new Map();
51
51
  const boxGeometry=new T.BoxGeometry(1,1,1);
52
52
  function box(g,x,y,z,dx,dy,dz,m){const o=new T.Mesh(boxGeometry,m);o.position.set(x,y,z);o.scale.set(Math.max(.03,dx),Math.max(.03,dy),Math.max(.03,dz));o.castShadow=true;o.receiveShadow=true;g.add(o);return o;}
53
53
  function cylinder(g,x,y,z,rad,height,m,segments=20){const o=new T.Mesh(new T.CylinderGeometry(rad,rad,height,segments),m);o.position.set(x,y,z);o.castShadow=true;o.receiveShadow=true;g.add(o);return o;}
@@ -209,7 +209,7 @@ export async function startThree(model,host,onSelect){
209
209
  box(g,0,Math.max(.25,sy*.5),0,sx,sy,sz,mat(base));
210
210
  box(g,0,Math.max(.4,sy),0,sx*.86,.085,sz*.82,mats.trim);
211
211
  }
212
- const name=label(e.id);name.position.set(0,Math.max(.8,sy)+.95,0);g.add(name);
212
+ const name=label(e.id);name.position.set(0,Math.max(.8,sy)+.95,0);name.userData.isEquipmentLabel=true;g.add(name);assetLabels.set(e.id,name);
213
213
  // Accessible click targets: industrial belts are too thin for reliable picking.
214
214
  // Invisible proxy is local to the asset group, never rendered, never collidable.
215
215
  const isTransport=['conveyor','sorter','junction'].includes(kind);
@@ -391,7 +391,21 @@ export async function startThree(model,host,onSelect){
391
391
  }
392
392
  }
393
393
  const ray=new T.Raycaster();const cursor=new T.Vector2();let selectedId=null;
394
- function selected(id){selectedId=id;const g=assets.get(id);selectRing.visible=!!g;if(g){const e=model.equipment.find(x=>x.id===id);selectRing.position.set(g.position.x,e.position.y-.42,g.position.z);selectRing.scale.setScalar(Math.max(1,Math.min(2.5,e.dimensions.x*.48)));}}
394
+ // Progressive label disclosure keeps large R9-style warehouse overviews legible.
395
+ // No inferred equipment relationships or operational status.
396
+ function refreshLabels(){
397
+ const candidates=model.equipment.filter(e=>visibleFloor==='all'||String(e.floor)===visibleFloor);
398
+ const near=dist<33,mid=dist<95;
399
+ const stride=near?1:Math.max(1,Math.ceil(candidates.length/(mid?32:18)));
400
+ let i=0;
401
+ for(const e of model.equipment){
402
+ const sprite=assetLabels.get(e.id);if(!sprite)continue;
403
+ const inFloor=visibleFloor==='all'||String(e.floor)===visibleFloor;
404
+ sprite.visible=inFloor&&(e.id===selectedId||near||(i++%stride===0));
405
+ }
406
+ }
407
+
408
+ function selected(id){selectedId=id;const g=assets.get(id);selectRing.visible=!!g;refreshLabels();if(g){const e=model.equipment.find(x=>x.id===id);selectRing.position.set(g.position.x,e.position.y-.42,g.position.z);selectRing.scale.setScalar(Math.max(1,Math.min(2.5,e.dimensions.x*.48)));}}
395
409
  // Frame each customer facility, independent of floor count or asset quantity.
396
410
  const bb=new T.Box3();
397
411
  for(const e of model.equipment){
@@ -408,7 +422,7 @@ export async function startThree(model,host,onSelect){
408
422
  function fitCamera(){
409
423
  if(activeBox.isEmpty())return;
410
424
  const w=Math.max(320,host.clientWidth||1100),h=Math.max(280,host.clientHeight||640);
411
- const aspect=w/h,halfAngle=T.MathUtils.degToRad(camera.fov*.5),m=.85;
425
+ const aspect=w/h,halfAngle=T.MathUtils.degToRad(camera.fov*.5),m=.93;
412
426
  const n=new T.Vector3(Math.cos(el)*Math.sin(az),Math.sin(el),Math.cos(el)*Math.cos(az));
413
427
  const right=new T.Vector3(Math.cos(az),0,-Math.sin(az));
414
428
  const up=new T.Vector3().crossVectors(n,right).normalize();
@@ -440,20 +454,20 @@ export async function startThree(model,host,onSelect){
440
454
  activeBox.expandByPoint(p.clone().sub(h));activeBox.expandByPoint(p.clone().add(h));
441
455
  }
442
456
  if(!activeBox.isEmpty())target.copy(activeBox.getCenter(new T.Vector3()));
443
- fitCamera();updateCamera();
457
+ fitCamera();updateCamera();refreshLabels();
444
458
  }
445
459
  let dragging=false,moved=false,px=0,py=0,startX=0,startY=0;
446
460
  renderer.domElement.style.touchAction='none';
447
461
  renderer.domElement.addEventListener('pointerdown',ev=>{if(ev.button!==0)return;dragging=true;moved=false;startX=px=ev.clientX;startY=py=ev.clientY;renderer.domElement.setPointerCapture(ev.pointerId);});
448
- renderer.domElement.addEventListener('pointermove',ev=>{if(!dragging)return;const dx=ev.clientX-px,dy=ev.clientY-py;px=ev.clientX;py=ev.clientY;if(Math.hypot(ev.clientX-startX,ev.clientY-startY)>6)moved=true;if(!moved)return;az-=dx*.006;el=Math.max(.08,Math.min(1.5,el+dy*.006));updateCamera();});
462
+ renderer.domElement.addEventListener('pointermove',ev=>{if(!dragging)return;const dx=ev.clientX-px,dy=ev.clientY-py;px=ev.clientX;py=ev.clientY;if(Math.hypot(ev.clientX-startX,ev.clientY-startY)>6)moved=true;if(!moved)return;az-=dx*.006;el=Math.max(.08,Math.min(1.5,el+dy*.006));updateCamera();refreshLabels();});
449
463
  renderer.domElement.addEventListener('pointercancel',()=>{dragging=false;});
450
464
  renderer.domElement.addEventListener('pointerup',ev=>{if(!dragging)return;dragging=false;if(moved)return;
451
465
  const box=renderer.domElement.getBoundingClientRect();cursor.x=((ev.clientX-box.left)/box.width)*2-1;cursor.y=-((ev.clientY-box.top)/box.height)*2+1;ray.setFromCamera(cursor,camera);
452
466
  const isVisible=o=>{while(o&&o!==scene){if(!o.visible)return false;o=o.parent;}return true;};
453
467
  const chosen=ray.intersectObjects(pickables,false).find(h=>isVisible(h.object)&&h.object.userData.asset);
454
468
  if(chosen)onSelect(chosen.object.userData.asset);
455
- });renderer.domElement.addEventListener('wheel',ev=>{ev.preventDefault();dist=Math.min(260,Math.max(6,dist*(ev.deltaY>0?1.11:.90)));updateCamera();},{passive:false});
456
- function resize(){const r=host.getBoundingClientRect();renderer.setSize(Math.max(320,r.width),Math.max(280,r.height),false);camera.aspect=Math.max(320,r.width)/Math.max(280,r.height);camera.updateProjectionMatrix();fitCamera();updateCamera();}const obs=new ResizeObserver(resize);obs.observe(host);resize();let active=true;
469
+ });renderer.domElement.addEventListener('wheel',ev=>{ev.preventDefault();dist=Math.min(260,Math.max(6,dist*(ev.deltaY>0?1.11:.90)));updateCamera();refreshLabels();},{passive:false});
470
+ function resize(){const r=host.getBoundingClientRect();renderer.setSize(Math.max(320,r.width),Math.max(280,r.height),false);camera.aspect=Math.max(320,r.width)/Math.max(280,r.height);camera.updateProjectionMatrix();fitCamera();updateCamera();}const obs=new ResizeObserver(resize);obs.observe(host);resize();refreshLabels();let active=true;
457
471
  function frame(){if(!active)return;
458
472
  const now=performance.now();
459
473
  for(const obj of simulatedParcels.values()){
@@ -0,0 +1 @@
1
+ __version__ = '0.1.8'
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devagent-ignition"
7
- version = "0.1.7"
7
+ version = "0.1.8"
8
8
  description = "Offline industrial HMI engineering and Ignition Perspective candidate tools (production deployment not qualified)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -1 +0,0 @@
1
- __version__ = '0.1.7'