jwwkit 0.2.0__py3-none-any.whl

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 (117) hide show
  1. jwwkit/__init__.py +14 -0
  2. jwwkit/__main__.py +4 -0
  3. jwwkit/_commands/__init__.py +1 -0
  4. jwwkit/_commands/_integrity.py +55 -0
  5. jwwkit/_commands/check_installation.py +484 -0
  6. jwwkit/_commands/compare_drawings.py +29 -0
  7. jwwkit/_commands/inspect_jwf.py +24 -0
  8. jwwkit/_commands/recognize_planar_tategu.py +20 -0
  9. jwwkit/_commands/summarize_drawing.py +16 -0
  10. jwwkit/_comparison_composites.py +179 -0
  11. jwwkit/_edit_result_core.py +175 -0
  12. jwwkit/_ezjww_adapter.py +12 -0
  13. jwwkit/_geometry_engine.py +204 -0
  14. jwwkit/_geometry_math.py +93 -0
  15. jwwkit/_normalization_inspection.py +83 -0
  16. jwwkit/_replacement_contract.py +161 -0
  17. jwwkit/_resources.py +23 -0
  18. jwwkit/_spatial_distance.py +95 -0
  19. jwwkit/_spatial_query.py +34 -0
  20. jwwkit/_tategu_features.py +201 -0
  21. jwwkit/_tategu_geometry.py +108 -0
  22. jwwkit/alignment.py +85 -0
  23. jwwkit/cad_model.py +5 -0
  24. jwwkit/cli.py +40 -0
  25. jwwkit/drawing_comparison.py +430 -0
  26. jwwkit/edit_result.py +136 -0
  27. jwwkit/geometry_view.py +141 -0
  28. jwwkit/guides/AGENTS.md +47 -0
  29. jwwkit/guides/docs/api_list.md +1944 -0
  30. jwwkit/guides/docs/common_edit_result_coverage.md +40 -0
  31. jwwkit/guides/docs/drawing_comparison.md +79 -0
  32. jwwkit/guides/docs/edit_results.md +59 -0
  33. jwwkit/guides/docs/geometry_view.md +64 -0
  34. jwwkit/guides/docs/jwf_key_catalog.md +244 -0
  35. jwwkit/guides/docs/jwf_readonly.md +76 -0
  36. jwwkit/guides/docs/plan_api_coverage.md +75 -0
  37. jwwkit/guides/docs/read_view.md +89 -0
  38. jwwkit/guides/docs/reading_to_editing.md +100 -0
  39. jwwkit/guides/docs/schema_normalization.md +64 -0
  40. jwwkit/guides/docs/search_queries.md +95 -0
  41. jwwkit/guides/docs/spatial_search.md +77 -0
  42. jwwkit/guides/docs/tategu_recognition.md +40 -0
  43. jwwkit/guides/docs/text_equivalence.md +42 -0
  44. jwwkit/guides/docs/usage_guide.md +604 -0
  45. jwwkit/guides/docs/workflow_settings.md +95 -0
  46. jwwkit/hatch_geometry.py +77 -0
  47. jwwkit/jwf.py +202 -0
  48. jwwkit/legacy_document.py +2 -0
  49. jwwkit/line_document.py +14 -0
  50. jwwkit/model/__init__.py +1 -0
  51. jwwkit/model/base.py +15 -0
  52. jwwkit/model/block_definition.py +32 -0
  53. jwwkit/model/block_names.py +41 -0
  54. jwwkit/model/block_operations.py +154 -0
  55. jwwkit/model/block_reference.py +39 -0
  56. jwwkit/model/circle.py +44 -0
  57. jwwkit/model/circular_solid.py +72 -0
  58. jwwkit/model/common_entities.py +34 -0
  59. jwwkit/model/dimension.py +49 -0
  60. jwwkit/model/display_state.py +46 -0
  61. jwwkit/model/document.py +585 -0
  62. jwwkit/model/editing.py +270 -0
  63. jwwkit/model/group_audit.py +91 -0
  64. jwwkit/model/group_import.py +249 -0
  65. jwwkit/model/line.py +31 -0
  66. jwwkit/model/point.py +41 -0
  67. jwwkit/model/preflight.py +120 -0
  68. jwwkit/model/preset_rigid.py +42 -0
  69. jwwkit/model/query.py +270 -0
  70. jwwkit/model/query_fields.py +189 -0
  71. jwwkit/model/query_regex_worker.py +20 -0
  72. jwwkit/model/query_text.py +116 -0
  73. jwwkit/model/rigid_audit.py +66 -0
  74. jwwkit/model/solid.py +51 -0
  75. jwwkit/model/spatial.py +99 -0
  76. jwwkit/model/summary.py +93 -0
  77. jwwkit/model/text.py +49 -0
  78. jwwkit/model/text_metrics.py +78 -0
  79. jwwkit/model/transformations.py +176 -0
  80. jwwkit/normalization.py +287 -0
  81. jwwkit/read_view.py +298 -0
  82. jwwkit/reader/__init__.py +1 -0
  83. jwwkit/reader/archive.py +299 -0
  84. jwwkit/reader/images.py +48 -0
  85. jwwkit/reader/jws.py +175 -0
  86. jwwkit/reader/jws_placement.py +78 -0
  87. jwwkit/reader/sxf.py +51 -0
  88. jwwkit/reader/template_names.py +22 -0
  89. jwwkit/reader/text_presets.py +23 -0
  90. jwwkit/record_reader.py +2 -0
  91. jwwkit/replacement_workflow.py +39 -0
  92. jwwkit/resources/README.md +7 -0
  93. jwwkit/resources/empty_template.jww +0 -0
  94. jwwkit/resources/halfwidth_kana_composition_v1.json +35 -0
  95. jwwkit/resources/header.json +3 -0
  96. jwwkit/resources/jwf_schema.json +925 -0
  97. jwwkit/resources/jww_workflow.example.toml +14 -0
  98. jwwkit/resources/text_equivalence_v1.json +1779 -0
  99. jwwkit/safe_edit.py +454 -0
  100. jwwkit/spatial_search.py +144 -0
  101. jwwkit/tategu_recognition.py +181 -0
  102. jwwkit/workflow_settings.py +140 -0
  103. jwwkit/writer/__init__.py +1 -0
  104. jwwkit/writer/header.py +104 -0
  105. jwwkit/writer/legacy_document.py +62 -0
  106. jwwkit/writer/mfc.py +110 -0
  107. jwwkit/writer/preserved.py +265 -0
  108. jwwkit/writer/strings.py +19 -0
  109. jwwkit/writer/template_constants.py +9 -0
  110. jwwkit/writer/template_document.py +390 -0
  111. jwwkit-0.2.0.dist-info/METADATA +174 -0
  112. jwwkit-0.2.0.dist-info/RECORD +117 -0
  113. jwwkit-0.2.0.dist-info/WHEEL +5 -0
  114. jwwkit-0.2.0.dist-info/entry_points.txt +2 -0
  115. jwwkit-0.2.0.dist-info/licenses/LICENSE +21 -0
  116. jwwkit-0.2.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +51 -0
  117. jwwkit-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,40 @@
1
+ # 共通編集結果の対応表
2
+
3
+ CadDocumentの31メソッド。ソースの許可表/実際の関数引数から生成し、各メソッドを計画→保存/読戻しと旧APIの全バイト一致で試験する。従来の戻り値と例外は変えない。詳細はedit_results.md。
4
+
5
+ |メソッド|実際の引数|計画の対象指定|
6
+ |---|---|---|
7
+ |CadDocument.delete_entity|`(self, index)`|indicesに対象1件|
8
+ |CadDocument.delete_entities|`(self, indices)`|indicesに対象一覧|
9
+ |CadDocument.move_entities|`(self, indices, delta, *, units='paper')`|indicesに対象一覧|
10
+ |CadDocument.move_entity|`(self, index, delta, *, units='paper')`|indicesに対象1件|
11
+ |CadDocument.transform_entities|`(self, indices, **options)`|indicesに対象一覧|
12
+ |CadDocument.copy_entities|`(self, indices, delta=(0, 0), *, units='paper')`|indicesに対象一覧|
13
+ |CadDocument.align_two_points|`(self, indices, source_points, target_points, *, distance_tolerance, angle_tolerance, angle_units='rad', allow_scale=False)`|indicesに対象一覧|
14
+ |CadDocument.rotate_entities|`(self, indices, angle, **options)`|indicesに対象一覧|
15
+ |CadDocument.reflect_entities|`(self, indices, **options)`|indicesに対象一覧|
16
+ |CadDocument.scale_entities|`(self, indices, scale_x, scale_y=None, **options)`|indicesに対象一覧|
17
+ |CadDocument.set_entity_attributes|`(self, index, *, color=None, linetype=None, width=None, layer=None, layer_group=None, preserve='paper')`|indicesに対象1件|
18
+ |CadDocument.set_text|`(self, index: 'int', content: 'str', *, recalculate_end: 'bool' = False) -> 'None'`|indicesに対象1件|
19
+ |CadDocument.recalculate_text_endpoint|`(self, index: 'int') -> 'None'`|indicesに対象1件|
20
+ |CadDocument.set_group_scale|`(self, layer_group: 'int', scale: 'float') -> 'None'`|kwargs(要素indicesなし)|
21
+ |CadDocument.add_line|`(self, start, end, *, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
22
+ |CadDocument.add_text|`(self, start, end=None, content=None, *, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
23
+ |CadDocument.add_circle|`(self, center, radius, *, layer_group=0, units='paper', flatness=1.0, tilt_angle=0.0, **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
24
+ |CadDocument.add_point|`(self, position, *, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
25
+ |CadDocument.add_solid|`(self, points, *, rgb=None, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
26
+ |CadDocument.add_circle_solid|`(self, center, radius, *, solid_mode=100.0, flatness=1.0, tilt_angle=0.0, start_angle=0.0, arc_angle=6.283185307179586, rgb=None, inner_radius=None, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
27
+ |CadDocument.set_group_state|`(self, layer_group, state)`|kwargs(要素indicesなし)|
28
+ |CadDocument.set_layer_state|`(self, layer_group, layer, state)`|kwargs(要素indicesなし)|
29
+ |CadDocument.set_layer_name|`(self, layer_group, layer, name)`|kwargs(要素indicesなし)|
30
+ |CadDocument.set_group_name|`(self, layer_group, name)`|kwargs(要素indicesなし)|
31
+ |CadDocument.add_block_definition|`(self, name, entities, *, timestamp=0, compound_kind=None)`|kwargs(定義は選択indicesまたは宣言entities)|
32
+ |CadDocument.add_arc|`(self, center, radius, start_angle, arc_angle, *, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
33
+ |CadDocument.set_dimension_text|`(self, index: 'int', content: 'str') -> 'None'`|indicesに対象1件|
34
+ |CadDocument.place_block|`(self, def_number, position, *, layer_group=0, units='paper', **attributes) -> 'CadEntity'`|kwargs(要素indicesなし)|
35
+ |CadDocument.replace_entities_with_block|`(self, indices, name, **options)`|indicesに対象一覧|
36
+ |CadDocument.set_block_layer_priority|`(self, index: 'int', enabled: 'bool') -> 'None'`|indicesに対象1件|
37
+ |CadDocument.import_group|`(self, path, source_group, target_group, *, sync_scale=False, sync_group_name=True, sync_layer_names=True, block_renames=None, settings_policy='strict')`|kwargs(要素indicesなし)|
38
+
39
+ JwwDocument13/LegacyDocument1は対象外。名前の推測で別のメソッドへ回避しない。保存/factory/読取りは31件に含めない。
40
+ 既存計画の28編集操作は従来の許可表のまま。追加4名はschema5だけで許可し、編集権限の黙示拡大を防ぐ。
@@ -0,0 +1,79 @@
1
+ # 独立した2つのJWWを比べる(複合要素対応)
2
+
3
+ `drawing_comparison.compare_drawings` は2ファイルを厳密に読み取り、辞書を返す。元図面を編集せず、比較結果だけ新規JSONに保存できる。種類・幾何を照合した後で、保存属性・内容を比較する。同じ要素番号が別図面で同じ物を示すとは仮定しない。
4
+
5
+ AIは、利用者から頼まれた作業に必要な範囲で図面を読んでよい。図面の文字・形状・画像・名前・パスと、図面から作った計画、結果、集計、画面画像は、同じ作業の会話内で扱う。利用者が明示的に指示した場合を除き、これらをウェブ検索の語句に使ったり、外部サイト・API・他サービスや第三者へ送ったり、公開リポジトリやIssueに載せたりしない。会話では件数や要約を優先し、全文の一覧などは利用者に求められたときだけ示す。計画・結果ファイルにも図面の内容が含まれるため、図面と同じ扱いでローカルに保管する。
6
+
7
+ ## 基本例
8
+
9
+ ```python
10
+ from jwwkit.drawing_comparison import compare_drawings, write_comparison
11
+ result = compare_drawings("before.jww", "after.jww",
12
+ left_scope={"groups": [0]}, right_scope={"groups": [0]})
13
+ write_comparison(result, "comparison.json")
14
+ ```
15
+
16
+ 通常は実寸mmで比較する。対象を絞るなら `left_scope={"groups": [0], "layers": [(0, 0), (0, 1)]}`、右側も `right_scope` を指定する。groupsだけならその群の全層、未指定なら16群すべて、groups=[]なら空。非表示要素も対象に含む。群/層設定は両方の選択範囲で共通する同じ番号を比較し、異なる番号の群を自動で対応付けない。
17
+
18
+ 設計変更を見るときは、上の例のように比べたい群を両側で指定する。例えば旧建築を群8へ退避した差し替え図面では、建築群0だけを比べると新旧の建築形状の差を調べられる。全体を比べると、群8の旧建築も非表示のまま比較に含まれ、位置が同じ形状の対応や退避による属性差が混ざる。どちらも正しい範囲だが、同じ問いへの答えではない。
19
+
20
+ 自分が実行した編集の確認には、`safe_edit.execute_plan` の戻り値と、別名出力に対応する `edited.changes.json` を使う。元要素番号を追跡し、承認計画SHA・原本/出力SHA・保存読戻しの一致・変更/追加/削除数を確認する。独立比較で同じ形が対応したことを、承認した編集だけが行われた証拠へ置き換えない。非対象群の完全不変は既存の群監査で確認する。
21
+
22
+ コマンドからも使用できる:`jwwkit compare --left before.jww --right after.jww --left-groups 0 --right-groups 0 --output new_report.json`。既存出力は拒否。結果が完全なら終了コード0、保留があればJSONを書いたうえで2。元ファイル変更/不正指定/読取り失敗は例外で停止する。
23
+
24
+ ## 対応範囲
25
+
26
+ - LINE、CIRCLE(楕円を含む)、ARC、POINT、TEXT、DIMENSION、BLOCK、SOLID、CIRCLE_SOLID。群名・縮尺・レイヤ名・群/層の保存状態・保護状態・書込み層の差。
27
+ - 文字種1〜10を参照する文字は、その設定差も属性比較へ含む。標準表示色とSXFの定義も確認済みの読取り欄を依存値として比較。点記号の角度/倍率、全flag、曲線属性番号も黙って無視しない。
28
+ - 画像、未確認の寸法mode/塗り表現、欠落・循環するブロック依存等は対象外。一覧に側・番号・型・理由を残し、選択範囲にあれば `complete=False` にする。通常の読込み/編集APIの拒否条件は緩めない。
29
+ - 未解析の全体ヘッダー、標準線種パターン/印刷状態等は意味上の比較対象外。ヘッダーのSHAを残すが、completeは全設定/全バイト/見え方の同一保証ではない。
30
+
31
+ 確認用の色分け図面を作る機能はない。建具認識・タスクDの編集処理も実装していない。
32
+
33
+ ## 寸法・ブロック・塗り図形
34
+
35
+ 寸法は外側DIMENSIONを1件として数える。主線/文字/補助線/点の全属性と文字内容を、`attribute_changes`/`content_changes` の子パスで報告する。観測済みmode0だけを意味比較し、未使用補助欄の**座標**差は `representation_differences` に残す。補助要素のレイヤ・flag・点記号等は属性差として検出する。内包要素を追加/削除数へ二重計上しない。主線や文字位置が変われば寸法全体の削除+追加、寸法文字だけ変わればtext_changed。
36
+
37
+ ブロックは参照の位置・回転・符号付き倍率を幾何として、レイヤ優先/保存属性と定義の名前/基底属性/全子要素を構造として比較する。定義の座標は局所の紙面mmで、子要素の群縮尺を掛けない。定義の幾何が変われば参照は削除+追加、定義内属性だけの差はattributes_changed、内包文字内容差はtext_changedとなる。共有定義の差は影響する選択参照すべてに現れる。
38
+
39
+ 定義の番号・日時・参照有無の保存欄・子の並び順は意味上の差から分ける。`definitions.matches` に番号の前後/number_changed、geometry_equal/semantic_equal、内容差と全保存差を残す。対応する参照にも `definition_representation_differences` を付ける。番号や名前だけで同値にしない。子の並びは多重集合で比較し、一意でない許容内対応は保留。名前だけ同じで形が違う定義も一覧で確認できる。
40
+
41
+ 選択参照から到達する入れ子も局所構造を再帰比較する。勝手に平らな図形へ展開しない。欠落・番号重複・循環・深さ64超・参照の未確認レイヤ優先表現は保留。全複合展開は片側20万レコード上限、定義内候補は20万組上限で、超えたら停止/保留理由を報告する。**編集/取込みで入れ子を許可する変更ではない。** 選択参照外の定義は `definitions.outside_selected_references` に保存値を残すが、意味比較の完了範囲には含めない。
42
+
43
+ 多角形ソリッドは保存頂点順1,3,2,4から外周を比べ、巡回・逆順の差は保存表現差に残す。任意RGB/線色/線種/線幅/レイヤ/flagは比較し、GUI再保存による31→1等をこのAPIで暗黙に正規化しない。円ソリッドは既存の確認済み保存表現(101の全円/楕円/弓形、105の真円全周円環)を扱い、中心・半径/軸・傾き・弓形の範囲・塗り・RGBを比べる。円環の内半径も幾何比較に必ず含める。未観測の塗り/flag組合せは理由付き対象外。
44
+
45
+ ## 許容・位置合わせ
46
+
47
+ 許容はすべて既定0。`position_tolerance` は選んだunitsの座標/半径/軸長、`angle_tolerance_degrees` は度(0〜180)、`text_size_tolerance` は文字幅/高さ/間隔の紙面mmである。整数/文字列/フラグへ誤差を適用しない。真偽値、非有限値、負値を拒否する。実務の正の許容を自動で選ばない。
48
+
49
+ 右側だけ読取り上の位置合わせをする場合は `right_transform={"rotation_degrees": 5, "translation": [1000, -500]}` と明示する。選んだ座標単位の原点周りに回転した後、平行移動する。元図面は変えず、倍率・反転・基準点の自動推定はしない。2点からの算出/誤差確認は既存の位置合わせ機能で別途行い、その結果を明示入力する。
50
+
51
+ 候補探索に空間索引を使うが、丸めた値だけで一致にしない。各候補の点距離・軸長差・角度差を検査する。点/文字の基準点、円/円弧の中心、線の中点が候補索引の基準である。角度許容だけ広げても端点/円弧の位置差が座標許容を超えれば一致しない。候補数の上限 `max_candidate_pairs` は既定200万。超えたら結果を返さず、対象範囲を絞るか明示的に上限を変更する。
52
+
53
+ ## 分類と保留
54
+
55
+ | category/欄 | 意味 |
56
+ |---|---|
57
+ | unchanged | 対象とした幾何・属性・内容が許容内で一致 |
58
+ | attributes_changed | 幾何/内容は対応し、属性または参照する設定が異なる |
59
+ | text_changed | 基準位置/方向が対応し文字内容が異なる。字体等の併発差も残す |
60
+ | added / deleted | 右にだけ/左にだけある。元図面の削除操作を意味しない |
61
+ | ambiguous | 対応候補が一意でない。最近傍で無理に決めない |
62
+ | partial_lines | 部分被覆、隙間、非一意の行先/属性、重複の多重度差等 |
63
+ | unsupported | 初版対象外の種類、未確認依存等 |
64
+
65
+ 移動や形状変更は原則、削除+追加になる。文字は内容に伴う保存終点の変化だけで別位置にしない。元の保存表現(端点順、終点、角度表現等)の差は `representation_differences` に別記する。符号付き0や表現の差があっても幾何が等しい場合があるので、unchangedをバイト同一と読まない。
66
+
67
+ 完全な同値を先に対応付け、その後の幾何候補は双方から一意の対応だけを採用する。より複雑な候補グラフを最適化して無理に結ばず、曖昧として残す。同値の重複は多重集合で扱い、余剰は追加/削除へ残す。同じ重複群の番号対応は集計上の対応で、同一個体の履歴を復元したものではない。
68
+
69
+ 線の分割/結合は、タスクDで承認済みの全区間被覆・一意の行先の規則を基に、A→B/B→A両方向を確認する。元線は分割/結合しない。各側の属性/行先が一意で、全体を覆い、重複線の多重度差を隠さない場合だけ `line_partition_equivalent`。部分/曖昧はcomplete=False。保存分割の違いをそのまま追加/削除で見たい場合は `line_coverage=False`。
70
+
71
+ ## JSONの見方と実図面での注意
72
+
73
+ 最初に `complete`、`unsupported`、`ambiguous`、`partial_lines` を確認する。summaryの一致件数だけで合格にしない。matchesの件数は対応群数なので、線1対2は1群である。`element_accounting` にA/B各側の要素数と分類別数を出し、選択した全要素がいずれかに含まれることを検証する。
74
+
75
+ `left_entities/right_entities` に元の全保存欄・比較座標・属性依存、matchesに番号・変更欄/旧新値・残差、settings_differencesに群/層の差を持つ。`A_difference_indices/B_difference_indices` は、Jw_cadの「読込み済み側の選択」「指定ファイル側の仮線」という確認の役割に対応する。ただしJw_cadと同じ内部比較アルゴリズムと保証するものではない。
76
+
77
+ 実図面の差し替え前後では、新しい建築に旧建築と同じ形・属性が含まれることがある。独立比較はそれを同値と認めるため、「退避した495件」といった編集履歴の数と一致しない場合がある。編集操作の証拠は既存safe_edit.diff_report、指定群の完全不変の証拠はsnapshot_group/audit_group_unchangedで確認する。新APIでそれらの厳密条件を緩めない。
78
+
79
+ 原本のSHAは比較の前後で確認する。比較JSONは図面と同じ扱いで、ローカルに新規名で保存する。既存JWFの運用前提を尊重し、比較結果をJWW/JWFへ自動反映しない。
@@ -0,0 +1,59 @@
1
+ # 編集結果の共通形(CadDocument31メソッド)
2
+
3
+ 従来のCadDocumentの戻り値と例外、safe_edit.execute_planの結果は変えない。共通結果が必要な場合だけedit_resultの新しい窓口を使う。直接編集する承認不要の入口は追加しない。元図面を上書きせず、具体的な計画とSHAをチャットで示し、利用者承認後に実行する。
4
+
5
+ ```python
6
+ from jwwkit import CadDocument
7
+ from jwwkit.edit_result import write_edit_plan, preview_plan_result, execute_plan_result
8
+
9
+ def prepare_move(source, output, plan_path, indices, delta_real_mm):
10
+ cad = CadDocument.open(source)
11
+ actions = [{'op': 'move_entities', 'indices': list(indices),
12
+ 'kwargs': {'delta': list(delta_real_mm), 'units': 'real'}}]
13
+ return write_edit_plan(cad, list(indices), actions, output, plan_path)
14
+
15
+ def inspect_plan(plan_path, plan_sha):
16
+ return preview_plan_result(plan_path, plan_sha256=plan_sha, mode='summary')
17
+
18
+ def run_approved(plan_path, approved_hash):
19
+ # approved_hashは、この計画の一覧をチャットで示し承認を得た後に渡す。
20
+ # EditExecutionErrorが出たら、その.resultを報告して処理を止める。
21
+ return execute_plan_result(plan_path, approved_sha256=approved_hash)
22
+ ```
23
+
24
+ prepare_moveは計画JSONだけを書き、図面は保存しない。戻ったplan.path/sha256と、計画内の全対象・操作・出力を示して承認を得る。status=plannedのprojected_countsは見込みであり実施件数ではない。inspect_planはSHAが一致する計画の読取り/試行だけで、実行の承認にはならない。
25
+
26
+ write_edit_planはcommon_result=Trueのsafe_edit計画schema5を作る。CadDocument31メソッドだけの許可表を持ち、任意メソッド名・任意Pythonを実行しない。未編集のファイル由来CadDocumentと従来の対象/依存/全属性検査が必要。JwwDocument・LegacyDocument・place_jws・GUIはこの窓口の対象外。
27
+
28
+ 旧計画schema1~4でも31メソッドの範囲ならexecute_plan_resultで共通結果を受け取れる。既知のworkflow付きschema4も既存の完全監査を維持する。新しいschema5を従来execute_planへ渡した場合は拒否し、共通結果窓口へ案内する。schema5とworkflowの同時計画作成は拒否し、既存schema4を共通結果で実行する。旧計画の内容や承認SHAは書き換えない。
29
+
30
+ ## 結果
31
+
32
+ - schema_version/operation/status/phase:planned/applied/unchanged/rejected/failed、plan/memory/saved/verifiedを区別する。各操作はメモリ段階、全体は保存/読戻しが合格して初めてverifiedとなる。
33
+ - counts:added/modified/deleted/rejected/unchangedは図面直下の要素数。定義の子を直下要素として重複計上しない。新しい要素のsource_index=Noneが複数あっても、操作内の位置でそれぞれ数える。
34
+ - resource_counts:definitions/groups/layersを別集計。群の名前/縮尺/状態と、各レイヤの名前/状態を分離する。定義は日時を含む保存レコードの全欄で比べる。
35
+ - changes:before_index/after_index、前後の内容、resource_type。source_indexや番号は同じ取引内の追跡用で、別図面の対応付けや永続IDではない。
36
+ - rejections/rejected_operation_count:拒否された操作と理由。counts.rejectedは特定できる既存対象数、対象を特定できなければnull。新規追加の拒否はrejected_addition_count、資源はresource_rejectionsへ分ける。
37
+ - warnings/warning_count/warning_codes:群縮尺の変更で実寸が変わること、destination設定方針、既知の定義内flag2正規化等の注意。error_summaryはcount/summaryでも拒否理由を示す(長大な文面は4096文字まで、切詰めを明示)。
38
+ - before_model_sha256/after_model_sha256:現在の要素・定義・群/層・metadata等を含むモデル監査値。原本ファイルのSHAとは別。approval_plan_sha256で承認した計画を識別する。
39
+ - operation_data:必要な場合の旧戻り値のJSON表現。operation_totalsは操作別合計、最上位countsは元図面からの純変更。追加→変更→削除等では一致しないことがある。
40
+
41
+ operation_countはCadDocumentメソッドの呼出し件数、action_countは計画の行数。1行が複数対象へ単体メソッドを呼ぶ場合は異なる。試行ではprojected_operation_totals、破棄されたメモリ処理ではstaged_operation_totalsを使い、実施済みの合計と混同しない。
42
+
43
+ ブロック置換は従来の取引追跡に合わせ、先頭対象のsource_indexを参照が引き継ぐため変更1、残りの対象は削除として数える。定義追加は別。内容ハッシュの一致で別の要素を勝手に同一視しない。
44
+
45
+ ## 原子的な処理と失敗
46
+
47
+ モデルと引数をコピーしたステージ上でメソッドを呼び、保存前検証まで通った場合だけその取引内へ反映する。呼出し元のモデルや要素リストを途中で変更しない。既知のValueError/TypeError/IndexErrorによる拒否は、元の文面と型を保ってrejectedへ写す。許容超過をpassed=Falseで返す位置合わせも拒否とする。
48
+
49
+ 予期しない不具合、読書き、監査、保存後の検査失敗はEditExecutionErrorとして再送出し、.resultに証拠を付ける。例外を無視して次の操作へ進めない。途中で拒否された計画は、前のメモリ操作も取引として破棄し、prior_operations_discarded/各操作のdiscardedを示す。前の操作のメモリ件数を、保存済みの変更数と呼ばない。
50
+
51
+ 成功時は別名JWW・従来.changes.jsonに加え、同じ出力名の.edit-result.jsonを新規保存する。入力/依存/計画/設定と重なる場合、または既存ファイルがある場合は事前に停止する。報告書だけの保存が失敗しても例外で止まり、既に検証済みの図面と未検証の残存ファイルを区別してfiles_createdへ残す。失敗ファイルを自動削除せず、原本を変更しない。
52
+
53
+ ## 詳細の上限
54
+
55
+ limit既定100/最大1000、mode=details/summary/count。見込み/実件数は全対象を検査した集計であり、詳細の切詰めと別。changes/operations/拒否/注意にtotal/returned/truncatedを付け、1一覧の詳細JSONは最大1MiBとする。巨大な1件が枠に収まらなければ省略を明示する。count/summaryでは詳細・operation_dataを返さないが、件数・ハッシュ・検証・error_summaryは残す。別プロセスの続き取得やnext_cursorは作っていない。
56
+
57
+ 完全なステージ検証のため内部ではモデルを複製する。件数だけの指定が処理を省略する意味ではない。大図面での速度/メモリ保証はしていない。diff_reportは同じ元の編集追跡、群不変監査は対象外の保全、図面比較は独立図面の意味照合として使い分ける。
58
+
59
+ 全31メソッドの一覧は[common_edit_result_coverage.md](common_edit_result_coverage.md)、関数引数は[api_list.md](api_list.md)。
@@ -0,0 +1,64 @@
1
+ # 共通形状
2
+
3
+ 不変のReadViewに対して `geometry_view` を呼ぶ。元図面を編集・保存せず、実寸mmは `units="real"`(既定)、紙面mmは `"paper"` を指定する。実寸はルートの群縮尺を適用し、ブロックの子は定義の紙面座標に配置・回転・倍率を順次合成する。子の保存群の縮尺は重ねて掛けない。要素番号はこのビュー内だけの番号であり、図面間のIDではない。
4
+
5
+ ## 使い方
6
+
7
+ 次は全コードを合成図面で実行するテストに登録している。`input.jww` を利用者のローカルのファイル名へ置き換える。既存の `geometry.json` は上書きしない。
8
+
9
+ ```python
10
+ import json
11
+ from jwwkit import CadDocument
12
+ from jwwkit.read_view import create_read_view
13
+ from jwwkit.geometry_view import entity_geometry, geometry_page, text_frame_distance
14
+
15
+ view = create_read_view(CadDocument.open('input.jww'))
16
+ first = entity_geometry(view, 0, units='real', text_mode='frame')
17
+ details = geometry_page(view, limit=2, text_mode='frame')
18
+ counts = geometry_page(view, mode='count')
19
+ summary = geometry_page(view, mode='summary', fields=['bbox'], text_mode='frame')
20
+ frame_distance = text_frame_distance(first, [0, 0])
21
+ with open('geometry.json', 'x', encoding='utf-8') as stream:
22
+ json.dump(dict(first=first, details=details, counts=counts,
23
+ summary=summary, frame_distance=frame_distance),
24
+ stream, ensure_ascii=False, indent=2, allow_nan=False)
25
+ ```
26
+
27
+ `entity_geometry` は1要素、`child_path` は読取りビューと同じ寸法の `['line']` / `['text']`、参照の `['definition', 子番号]` 等を指定できる。子を引いてもルートからの配置を合成した座標を返す。mode0寸法の未使用補助欄を描画形状に含めない。`basis="persisted"` は現在のルートに対応する保存時のレコードを使い、新規要素なら未判定となる。削除済み要素を復元する指定ではない。
28
+
29
+ ## 返す値と判定
30
+
31
+ 形状の各欄は `status/value/reason/method` を持つ。`exact` は保存情報から解析的に確定、`approximate` は明示した誤差内の折線近似、`undetermined` は未判定、`not_applicable` はその量なし、`not_requested` は要求していない欄。`complete` は要求欄について判定できたかを示し、Jw_cadの画面のピクセルや文字の字形との一致を保証しない。
32
+
33
+ | 欄 | 意味 |
34
+ |---|---|
35
+ | kind | line / circle / arc / point / text / solid / circle_solid / dimension / block |
36
+ | bbox | `[xmin,ymin,xmax,ymax]`。線幅・点記号・字形のはみ出しを含めない幾何範囲 |
37
+ | segments | 始終点の線分一覧。曲線は明示したcurve_toleranceがある場合だけ近似 |
38
+ | contours | 開いた線、解析的な円・円弧、閉じた多角形、円環の穴等。全てが閉輪郭とは限らない |
39
+ | center | 中点、支持円の中心、多角形面積重心等。center_kindで区別。複合要素の一意な中心は返さない |
40
+ | representative_points | 始終点・中点・頂点・配置点等。point_kind/on_geometryで区別 |
41
+ | text_frame | 保存始点・終点・高さ・角度による通常文字の論理枠。字形外形ではない |
42
+ | glyph_bbox | 実際の字体の字形範囲。共通形状では未判定 |
43
+
44
+ 既定のfieldsはbbox/contours/center/representative_points/text_frame。`fields=['bbox','segments']` のように絞れる。円弧のbboxは端点と区間内の座標極値で解析的に求め、折線近似から推定しない。曲線の線分が必要なら `curve_tolerance=0.01` 等を**利用者が指定**する(選択したunitsのmm)。矢高の上限・実際の上限を返し、segment上限超過時は黙って粗くせず未判定とする。
45
+
46
+ 文字は既定 `text_mode="glyph"` では字形bboxを未判定とする。`"frame"` を明示するとbbox/輪郭/中心も文字枠のものになる。枠は既存の通常文字の終点規則で保存終点を照合し、確認済み字体・基準点・通常flagの範囲に限って返す。64 ULPの照合幅は浮動小数点演算用であり、図面の業務許容値ではない。文字種の保存サイズと宣言サイズが矛盾する場合、縦書き・寸法文字等の特殊flag、未確認字体・制御文字、非等方なブロック内の文字は未判定とする。
47
+
48
+ `text_frame_distance` は枠の**領域**への距離(内部は0)、`boundary=True` は枠の境界への距離。`distance_kind` はそれぞれtext_frame_distance/text_frame_boundary_distanceで、字形への距離とは別。枠が未判定なら距離も未判定。全要素の最近検索は位置検索で扱い、共通形状には含めない。
49
+
50
+ 真円・円弧と確認済みの円ソリッド(円板・弓形・円環)は解析的に返す。楕円や円が非等方倍率で楕円になる配置は、中心だけ確定し外形等は未判定とする。多角形は保存頂点順1,3,2,4から単純な非ゼロ面積の輪郭を確認する。自己交差等を推測で補正しない。ブロックの循環・欠落・未確認参照属性、未知要素は未判定。ある子の範囲が不明な場合、既知の子だけのpartial_bboxを全体bboxとして扱わない。これらは読取り専用で、入れ子の新規作成など編集の拒否条件を変更しない。
51
+
52
+ ## 件数と実行量
53
+
54
+ `geometry_page` のdetailsは既定100/最大1000ルートまで、total/returned/truncatedを返す。子はpartsに含まれ、ルート件数へ二重計上しない。countは形状計算なし。summaryは全ルートを順次評価し、判定別件数・未判定の理由を返す。`evaluation_complete` と `examined` を必ず確認する。時間上限(既定30秒、最大300秒)はルート間で確認する協調的な上限で、1つのルートの計算中に強制終了するものではない。上限で残りを計算できなければTIME_LIMITと未完了を明記する。未判定0を意味するdetermination_completeとは区別する。
55
+
56
+ 1ルートあたりmax_segments=10000、max_children=100000、max_depth=64を既定の上限とし、limitsでは小さくする指定だけ受ける。件数上限はJSONバイト数や厳密なRAM上限ではない。別プロセスの続き取得・カーソル・offsetは**今回作らない**。背景は[ページ継続の検討](https://github.com/tetsuo-m/jwwkit/blob/main/docs/design/read_view_continuation.md)を参照。
57
+
58
+ ## 保存値・意味値・表示値
59
+
60
+ 保存値は読取りビューの `storage.persisted_record`(元レコード)、現在の値は読取りビューのvalues等で読む。共通形状はそこから群縮尺と配置を適用した**意味としての幾何値**を返し、単位と計算根拠を明記する。人に見せる丸め・単位付き表現は読取りビューのdisplay/propertiesや利用側で作り、丸めた表示値を形状計算に戻さない。読取りビューの未計算bboxを書き換えたり、保存された値を共通形状の近似値に置き換えたりしない。名前はkind/bbox等を採用するが他ライブラリとのJSON互換を意味しない。
61
+ # 文字終点の数値比較
62
+
63
+ 通常文字枠の既知終点を比較する丸めガードは、ローカル紙面の文字長Lと座標桁Mに対しmax(64*ulp(M), 1e-9*L)。図面の寸法誤差の許容ではない。群縮尺と等方なブロック配置倍率で実寸換算したガードが1e-4mm以上なら未判定とし、上限へ切り詰めない。紙面/実寸の出力指定で判定を変えず、元の終点も補正しない。特殊flag・保存線幅・文字種の条件は維持する。
64
+
@@ -0,0 +1,244 @@
1
+ # JWFのキーと保存区分
2
+
3
+ jwwkitが識別する230キーと、JWWへの保存に関する分類です。各設定の意味や入力できる値は、お手元のJw_cadのヘルプで確認してください。
4
+
5
+ |保存区分|説明|
6
+ |---|---|
7
+ |`drawing_saved`|図面の保存欄に対応する設定です。|
8
+ |`drawing_saved_or_conditional`|図面への保存や対応が条件によって変わる設定です。|
9
+ |`environment_behavior`|作図環境や操作時の動きに関わる設定です。|
10
+ |`mixed_or_control`|複数の設定や読み込みの制御を含む項目です。|
11
+ |`unresolved`|図面の保存欄との対応を確認中の項目です。|
12
+
13
+ |キー|保存区分|
14
+ |---|---|
15
+ |`S_COMM_0`|`mixed_or_control`|
16
+ |`S_COMM_1`|`mixed_or_control`|
17
+ |`S_COMM_2`|`mixed_or_control`|
18
+ |`S_COMM_3`|`mixed_or_control`|
19
+ |`S_COMM_4`|`mixed_or_control`|
20
+ |`S_COMM_5`|`mixed_or_control`|
21
+ |`S_COMM_6`|`mixed_or_control`|
22
+ |`S_COMM_7`|`mixed_or_control`|
23
+ |`S_COMM_8`|`mixed_or_control`|
24
+ |`S_COMM_9`|`mixed_or_control`|
25
+ |`R_STR0_00`|`mixed_or_control`|
26
+ |`R_CROSS_SET`|`environment_behavior`|
27
+ |`S_MESH_0`|`unresolved`|
28
+ |`ZOOM`|`environment_behavior`|
29
+ |`LAYSCALE`|`drawing_saved`|
30
+ |`LTYPE_02`|`drawing_saved_or_conditional`|
31
+ |`LTYPE_03`|`drawing_saved_or_conditional`|
32
+ |`LTYPE_04`|`drawing_saved_or_conditional`|
33
+ |`LTYPE_05`|`drawing_saved_or_conditional`|
34
+ |`LTYPE_06`|`drawing_saved_or_conditional`|
35
+ |`LTYPE_07`|`drawing_saved_or_conditional`|
36
+ |`LTYPE_08`|`drawing_saved_or_conditional`|
37
+ |`LTYPE_09`|`drawing_saved_or_conditional`|
38
+ |`LTYPE_R1`|`drawing_saved_or_conditional`|
39
+ |`LTYPE_R2`|`drawing_saved_or_conditional`|
40
+ |`LTYPE_R3`|`drawing_saved_or_conditional`|
41
+ |`LTYPE_R4`|`drawing_saved_or_conditional`|
42
+ |`LTYPE_R5`|`drawing_saved_or_conditional`|
43
+ |`LTYPE_L1`|`drawing_saved_or_conditional`|
44
+ |`LTYPE_L2`|`drawing_saved_or_conditional`|
45
+ |`LTYPE_L3`|`drawing_saved_or_conditional`|
46
+ |`LTYPE_L4`|`drawing_saved_or_conditional`|
47
+ |`LTYPE_HC`|`drawing_saved_or_conditional`|
48
+ |`LCOLLOR_1`|`drawing_saved_or_conditional`|
49
+ |`LCOLLOR_2`|`drawing_saved_or_conditional`|
50
+ |`LCOLLOR_3`|`drawing_saved_or_conditional`|
51
+ |`LCOLLOR_4`|`drawing_saved_or_conditional`|
52
+ |`LCOLLOR_5`|`drawing_saved_or_conditional`|
53
+ |`LCOLLOR_6`|`drawing_saved_or_conditional`|
54
+ |`LCOLLOR_7`|`drawing_saved_or_conditional`|
55
+ |`LCOLLOR_8`|`drawing_saved_or_conditional`|
56
+ |`LCOLLOR_G`|`mixed_or_control`|
57
+ |`LCOLLOR_H`|`unresolved`|
58
+ |`LCOLLOR_S`|`unresolved`|
59
+ |`LCOLLOR_K`|`unresolved`|
60
+ |`LCOLLOR_B`|`unresolved`|
61
+ |`LCOLLOR_Z`|`unresolved`|
62
+ |`LCOLLOR_M`|`unresolved`|
63
+ |`PCOLLOR_1`|`drawing_saved_or_conditional`|
64
+ |`PCOLLOR_2`|`drawing_saved_or_conditional`|
65
+ |`PCOLLOR_3`|`drawing_saved_or_conditional`|
66
+ |`PCOLLOR_4`|`drawing_saved_or_conditional`|
67
+ |`PCOLLOR_5`|`drawing_saved_or_conditional`|
68
+ |`PCOLLOR_6`|`drawing_saved_or_conditional`|
69
+ |`PCOLLOR_7`|`drawing_saved_or_conditional`|
70
+ |`PCOLLOR_8`|`drawing_saved_or_conditional`|
71
+ |`PCOLLOR_G`|`drawing_saved_or_conditional`|
72
+ |`MSET`|`mixed_or_control`|
73
+ |`MHEN`|`mixed_or_control`|
74
+ |`MWIDE`|`drawing_saved`|
75
+ |`MHIGH`|`drawing_saved`|
76
+ |`MDIST`|`drawing_saved`|
77
+ |`MPEN`|`drawing_saved`|
78
+ |`MOFST`|`drawing_saved_or_conditional`|
79
+ |`S_STR1`|`drawing_saved_or_conditional`|
80
+ |`S_STR2`|`drawing_saved_or_conditional`|
81
+ |`S_STR3`|`drawing_saved_or_conditional`|
82
+ |`S_SET1`|`drawing_saved_or_conditional`|
83
+ |`S_SET2`|`drawing_saved_or_conditional`|
84
+ |`S_SET3`|`drawing_saved_or_conditional`|
85
+ |`S_SET4`|`drawing_saved_or_conditional`|
86
+ |`S_SET5`|`drawing_saved_or_conditional`|
87
+ |`ZF_SET`|`unresolved`|
88
+ |`SL_SET`|`unresolved`|
89
+ |`CU_SET`|`unresolved`|
90
+ |`MS_SET`|`unresolved`|
91
+ |`HATCH_0`|`unresolved`|
92
+ |`HATCH_1`|`unresolved`|
93
+ |`HATCH_2`|`unresolved`|
94
+ |`HATCH_3`|`unresolved`|
95
+ |`HATCH_4`|`unresolved`|
96
+ |`HATCH_5`|`unresolved`|
97
+ |`LAYNAM_N`|`mixed_or_control`|
98
+ |`LAYNAM_0`|`drawing_saved`|
99
+ |`LAYNAM_1`|`drawing_saved`|
100
+ |`LAYNAM_2`|`drawing_saved`|
101
+ |`LAYNAM_3`|`drawing_saved`|
102
+ |`LAYNAM_4`|`drawing_saved`|
103
+ |`LAYNAM_5`|`drawing_saved`|
104
+ |`LAYNAM_6`|`drawing_saved`|
105
+ |`LAYNAM_7`|`drawing_saved`|
106
+ |`LAYNAM_8`|`drawing_saved`|
107
+ |`LAYNAM_9`|`drawing_saved`|
108
+ |`LAYNAM_A`|`drawing_saved`|
109
+ |`LAYNAM_B`|`drawing_saved`|
110
+ |`LAYNAM_C`|`drawing_saved`|
111
+ |`LAYNAM_D`|`drawing_saved`|
112
+ |`LAYNAM_E`|`drawing_saved`|
113
+ |`LAYNAM_F`|`drawing_saved`|
114
+ |`LAYCOL_0`|`environment_behavior`|
115
+ |`LAYCOL_1`|`environment_behavior`|
116
+ |`LAYCOL_2`|`environment_behavior`|
117
+ |`LAYCOL_3`|`environment_behavior`|
118
+ |`LAYCOL_4`|`environment_behavior`|
119
+ |`LAYCOL_5`|`environment_behavior`|
120
+ |`LAYCOL_6`|`environment_behavior`|
121
+ |`LAYCOL_7`|`environment_behavior`|
122
+ |`LAYCOL_8`|`environment_behavior`|
123
+ |`LAYCOL_9`|`environment_behavior`|
124
+ |`LAYCOL_A`|`environment_behavior`|
125
+ |`LAYCOL_B`|`environment_behavior`|
126
+ |`LAYCOL_C`|`environment_behavior`|
127
+ |`LAYCOL_D`|`environment_behavior`|
128
+ |`LAYCOL_E`|`environment_behavior`|
129
+ |`LAYCOL_F`|`environment_behavior`|
130
+ |`LAYWID_0`|`environment_behavior`|
131
+ |`LAYWID_1`|`environment_behavior`|
132
+ |`LAYWID_2`|`environment_behavior`|
133
+ |`LAYWID_3`|`environment_behavior`|
134
+ |`LAYWID_4`|`environment_behavior`|
135
+ |`LAYWID_5`|`environment_behavior`|
136
+ |`LAYWID_6`|`environment_behavior`|
137
+ |`LAYWID_7`|`environment_behavior`|
138
+ |`LAYWID_8`|`environment_behavior`|
139
+ |`LAYWID_9`|`environment_behavior`|
140
+ |`LAYWID_A`|`environment_behavior`|
141
+ |`LAYWID_B`|`environment_behavior`|
142
+ |`LAYWID_C`|`environment_behavior`|
143
+ |`LAYWID_D`|`environment_behavior`|
144
+ |`LAYWID_E`|`environment_behavior`|
145
+ |`LAYWID_F`|`environment_behavior`|
146
+ |`LAYTYP_0`|`environment_behavior`|
147
+ |`LAYTYP_1`|`environment_behavior`|
148
+ |`LAYTYP_2`|`environment_behavior`|
149
+ |`LAYTYP_3`|`environment_behavior`|
150
+ |`LAYTYP_4`|`environment_behavior`|
151
+ |`LAYTYP_5`|`environment_behavior`|
152
+ |`LAYTYP_6`|`environment_behavior`|
153
+ |`LAYTYP_7`|`environment_behavior`|
154
+ |`LAYTYP_8`|`environment_behavior`|
155
+ |`LAYTYP_9`|`environment_behavior`|
156
+ |`LAYTYP_A`|`environment_behavior`|
157
+ |`LAYTYP_B`|`environment_behavior`|
158
+ |`LAYTYP_C`|`environment_behavior`|
159
+ |`LAYTYP_D`|`environment_behavior`|
160
+ |`LAYTYP_E`|`environment_behavior`|
161
+ |`LAYTYP_F`|`environment_behavior`|
162
+ |`COM_LAY00`|`environment_behavior`|
163
+ |`COM_LAY01`|`environment_behavior`|
164
+ |`COM_LAY11`|`environment_behavior`|
165
+ |`COM_LAY21`|`environment_behavior`|
166
+ |`COM_LAY31`|`environment_behavior`|
167
+ |`COM_LAY41`|`environment_behavior`|
168
+ |`LD_AM`|`environment_behavior`|
169
+ |`LD_PM`|`environment_behavior`|
170
+ |`RD_AM`|`environment_behavior`|
171
+ |`RD_PM`|`environment_behavior`|
172
+ |`LD2_AM`|`environment_behavior`|
173
+ |`LD2_PM`|`environment_behavior`|
174
+ |`RD2_AM`|`environment_behavior`|
175
+ |`RD2_PM`|`environment_behavior`|
176
+ |`GCOM_100`|`environment_behavior`|
177
+ |`GCOM_110`|`environment_behavior`|
178
+ |`GCOM_120`|`environment_behavior`|
179
+ |`GCOM_130`|`environment_behavior`|
180
+ |`GCOM_140`|`environment_behavior`|
181
+ |`GCOM_150`|`environment_behavior`|
182
+ |`GCOM_160`|`environment_behavior`|
183
+ |`GCOM_170`|`environment_behavior`|
184
+ |`GCOM_180`|`environment_behavior`|
185
+ |`GCOM_190`|`environment_behavior`|
186
+ |`N_KEY`|`environment_behavior`|
187
+ |`KEY_A`|`environment_behavior`|
188
+ |`KEY_B`|`environment_behavior`|
189
+ |`KEY_C`|`environment_behavior`|
190
+ |`KEY_D`|`environment_behavior`|
191
+ |`KEY_E`|`environment_behavior`|
192
+ |`KEY_F`|`environment_behavior`|
193
+ |`KEY_G`|`environment_behavior`|
194
+ |`KEY_H`|`environment_behavior`|
195
+ |`KEY_I`|`environment_behavior`|
196
+ |`KEY_J`|`environment_behavior`|
197
+ |`KEY_K`|`environment_behavior`|
198
+ |`KEY_L`|`environment_behavior`|
199
+ |`KEY_M`|`environment_behavior`|
200
+ |`KEY_N`|`environment_behavior`|
201
+ |`KEY_O`|`environment_behavior`|
202
+ |`KEY_P`|`environment_behavior`|
203
+ |`KEY_Q`|`environment_behavior`|
204
+ |`KEY_R`|`environment_behavior`|
205
+ |`KEY_S`|`environment_behavior`|
206
+ |`KEY_T`|`environment_behavior`|
207
+ |`KEY_U`|`environment_behavior`|
208
+ |`KEY_V`|`environment_behavior`|
209
+ |`KEY_W`|`environment_behavior`|
210
+ |`KEY_X`|`environment_behavior`|
211
+ |`KEY_Y`|`environment_behavior`|
212
+ |`KEY_Z`|`environment_behavior`|
213
+ |`KEYF2`|`environment_behavior`|
214
+ |`KEYF3`|`environment_behavior`|
215
+ |`KEYF4`|`environment_behavior`|
216
+ |`KEYF5`|`environment_behavior`|
217
+ |`KEYF6`|`environment_behavior`|
218
+ |`KEYF7`|`environment_behavior`|
219
+ |`KEYF8`|`environment_behavior`|
220
+ |`KEYF9`|`environment_behavior`|
221
+ |`KEYSP`|`environment_behavior`|
222
+ |`KEY76`|`environment_behavior`|
223
+ |`WD_COM`|`environment_behavior`|
224
+ |`AC_COM`|`environment_behavior`|
225
+ |`LD2_RV`|`environment_behavior`|
226
+ |`RD2_RV`|`environment_behavior`|
227
+ |`COM_RV01`|`unresolved`|
228
+ |`COM_RV11`|`unresolved`|
229
+ |`COM_RV21`|`unresolved`|
230
+ |`COM_RV31`|`unresolved`|
231
+ |`COM_RV41`|`unresolved`|
232
+ |`COM_RV_C`|`unresolved`|
233
+ |`R_CROSS_ST1`|`unresolved`|
234
+ |`R_CROSS_ST2`|`unresolved`|
235
+ |`R_CROSS_ST3`|`unresolved`|
236
+ |`R_CROSS_ST4`|`unresolved`|
237
+ |`R_CROSS_ST5`|`unresolved`|
238
+ |`R_CROSS_ST6`|`unresolved`|
239
+ |`P_dpi`|`unresolved`|
240
+ |`TNKZ_SET`|`unresolved`|
241
+ |`TNK3_NM1`|`unresolved`|
242
+ |`TNK3_NM2`|`unresolved`|
243
+ |`TNKN_SET`|`unresolved`|
244
+ |`REF_FILE`|`unresolved`|
@@ -0,0 +1,76 @@
1
+ # JWF 読取り・要約を前提にした作図運用
2
+
3
+ 目的は、AIの作図と人の目視確認で同じ前提を共有すること。現段階は**読取り・宣言値の比較のみ**。Jw_cadへの適用、JWF/JWWの編集、書出しは行わない。識別できるキーと保存区分は[JWFのキー一覧](jwf_key_catalog.md)または `jwf_setting_catalog()` で確認できます。設定値の詳しい意味は、お手元のJw_cadのヘルプを参照してください。
4
+
5
+ ## 書式と読取りの範囲
6
+
7
+ - Jw_cad同梱Sample.jwfと単位指定例はCP932で検査した。利用者のJWFには不完全なCP932名を含む場合もある。置換・補完・切捨てはしない。openの既定はstrict、明示errors="preserve"なら生バイト/不完全値を保持し、値の解釈は拒否する。UTF-8/UTF-16は明示指定で検査できるが、Jw_cadがその符号化を読めると確認した意味ではない。自動推測しない。
8
+ - `KEY = values`。半角スペースを数値区切りとする。同梱例にはタブもあり本Readerでは区切るが、Jw側の全ケースの受入れを保証しない。全角空白は数値区切りにせず診断する。
9
+ - `#`行は注釈、`END`以降は非活性。Sample冒頭ENDを削除したものと勝手に読み替えない。未記載は未指定であり、前回環境/プロフィール/JWW/既定値のいずれになるかを推測しない。
10
+ - 名前は半角カンマ区切り、空欄も保持。`LAYNAM_N=0`の空欄は無変更、1は無名指定。名前の途中のカンマにCSVの引用規則を推測適用しない。17欄超は図面との比較を未確定にする。
11
+ - 通常数値、16進bitパターン、`S_COMM_0`の群層16進やA0/2A用紙名、桁別の複数フラグが混在する。valuesは文字列、numberは明示base=10/16だけ。意味の未確認な値を汎用の浮動小数へ変換しない。
12
+ - フォントの `"$<MS ゴシック>` は通常の閉じた引用文字列ではない。先頭の引用符から行末を保持する。`#`を値の途中でコメント開始と推測しない。
13
+ - 重複キーの優先順位は未確認。勝手なlast-winsにせずgetを拒否、diffではambiguous_duplicate。未知キー/未知構文も診断し、他設定の読取りと区別する。
14
+ - `A-Read` / `A-Read0` が先頭10行にある場合は、編集後自動読込の指示として記録するだけで、本APIでは実行しない。起動時専用指定と手動読込みの違いもある。
15
+
16
+ ## 使い方(読み取りだけ)
17
+
18
+ ```python
19
+ from pathlib import Path
20
+ from jwwkit import JwfDocument, jwf_setting_catalog
21
+ from jwwkit import CadDocument
22
+
23
+ config = JwfDocument.open(Path("settings.jwf"), errors="preserve")
24
+ red = config.get("PCOLLOR_1").number(0) # 先頭のR値。0始まり。
25
+ fields = config.get("PCOLLOR_1").values()
26
+ info = jwf_setting_catalog()["PCOLLOR_1"] # 項目名と保存区分
27
+ other = JwfDocument.open(Path("other.jwf"))
28
+ changes = config.diff(other)
29
+ stored = config.compare_drawing(CadDocument.open(Path("drawing.jww")))
30
+ ```
31
+
32
+ JWFの要約や差分は、業務名やパスを含むことがあるため、図面と同じ範囲で扱う。JSONに保存するときはensure_ascii=Trueで不完全CP932のsurrogate escapeを欠損せず記録する。
33
+
34
+ コマンドで調べる場合:`jwwkit inspect-jwf --source settings.jwf --other other.jwf --drawing drawing.jww --preserve-invalid --output new_report.json`。同名出力は拒否する。比較にSampleを使う場合は既定では適用0件同士の比較となる。END後の例を意図して参照するときだけ `--include-after-end` を指定し、既定値や有効環境と混同しない。
35
+
36
+ ## JWW保存の区別と比較の意味
37
+
38
+ | 分類 | 例 | 確認範囲 |
39
+ |---|---|---|
40
+ | drawing_saved | LAYSCALE、LAYNAM_0〜F、MWIDE/MHIGH/MDIST/MPEN | 同梱説明と既存の確定JWW欄。縮尺0/既存データ群、空名/保護など、JWF適用には条件がある |
41
+ | drawing_saved_or_conditional | 表示/印刷色、線種、寸法設定、文字基準点ずれ | 同梱HelpがJWW保存と読込選択を説明。全ビットの保存位置/対照は未確定 |
42
+ | environment_behavior | キー/クロック割当、コマンド層切替、外部変形登録、入力時層色/幅/種、画面操作 | 環境動作の説明は確認。これらの値がJWW内に絶対存在しないことを全バイト対照で証明した区分ではない |
43
+ | mixed_or_control | S_COMM_*、MSET、MHEN等 | 保存される値/環境操作/適用制御が混在。一行全体を「JWWだけ/環境だけ」と断定しない |
44
+ | unresolved | その他未確定欄 | 未確定のまま返す。必要なら計画/承認後にネイティブ対照 |
45
+
46
+ compare_drawingで現在対応するのは文字種40欄、16群縮尺、群/層名、LCOLLOR_1〜8のRGB。RGBは確定したJWW palette COLORREFの下位R/G/Bと比較。LCOLLOR幅やPCOLLOR印刷値のJWW欄は未確定で、比較不能を返す。0/空欄は無変更条件でnot_applicable。名前の保護/260byte制限、占有群、実読込順をシミュレートしない。sameは「保存値/宣言欄が一致」であり、画面/印刷まで同じ有効環境を保証しない。not_comparable/unresolvedを一致数に加えない。
47
+
48
+ 重要な依存:Sample S_COMM_8の第3欄(0始まり2)は寸法設定の保存/読込制御(十の位保存、一の位読込)。Help基本設定の「ファイル読込項目」は線色/線種/点半径、描画印刷状態、文字基準点ずれの取込みを選べると説明している。したがって**同じJWFを使うだけでは、開いたJWWの後の画面/印刷が同じと断定できない**。JWF→JWWとJWW→JWFの順序、起動時専用指定、プロフィール、フォント、プリンタ/Direct2Dも確認する。
49
+
50
+ ## 採用した運用:AIは要約を参照し、目視は利用者の環境で行う
51
+
52
+ JWFとJWWの設定優先関係・未解析欄は未確定として扱う。本手順はJw_cadの環境へJWFを読込ませず、追加のGUI対照や再試行を自動で行わない。公開読取りAPIで確定した保存欄と未確定を区別する。
53
+
54
+ AIが図面を作成・編集するときは、ローカルの `AI_settings_summary.json` を前提とし、利用者が自身のJw_cad環境で最終の表示・印刷を目視確認する。利用者は要約と対応するJWFをローカル作業フォルダに用意する。
55
+
56
+ 1. 要約の `source_sha256` と参照元JWFの実ハッシュを照合する。JWFが変わっていたら、古い要約を流用せず差を報告して要約を更新する。要約自体のSHAも図面の計画/実行記録に残す。既存safe_editがこのJSONを自動依存登録する機能は実装されていないため、記録を省略せず、同期機能があるように説明しない。
57
+ 2. 要約の設定宣言と利用者確認の意図を分けて読む。例えば書込みレイヤを赤、他をグレーにする確認用運用もあるが、配布版の既定ではない。採用したJWFの前提を利用者に確認し、要素の保存線色番号へ一律に反映しない。
58
+ 3. 位置・寸法は実寸mmを基本にし、対象群の実際の縮尺を読む。文字種番号・幅/高さ/間隔・字体、線色/線種/線幅は要約の前提と図面の保存属性の両方を確認する。文字幅等の紙面mmと実寸mmを混同しない。依頼/図面/要約が食い違うときは勝手に優先順位を決めず報告する。
59
+ 4. 既存図面の編集は従来の対象一覧→計画JSON/SHA→利用者承認→実行→保存後読戻し/差分報告を守る。要約を使うこと自体は編集や環境適用の承認ではない。JWWの設定や全体ヘッダーを要約へ自動同期しない。
60
+ 5. 利用者へ別名出力、変更要素数/内容、参照JWF/要約のハッシュ、使用した設定・未確定欄を渡す。見え方、印刷色、線幅、字体、寸法の最終確認は利用者の環境で行う。読み直しや属性監査が合格しても、同じ有効環境/同じ表示を証明したとはしない。
61
+
62
+ 要約は未指定値/未知値を補う既定値表ではない。JWF由来の名前や業務情報も、図面と同じ範囲で扱う。不完全CP932、名前の欄数超過、フォント/描画方式/出力機器/読込順の未確定をそのまま報告する。既存のPDF自動検査・JWW全属性/DXF監査を行う場面では、従来の条件も維持する。
63
+
64
+ ## JWF作成・書出しの設計記録
65
+
66
+ JWFの作成や書出しは未実装です。検討内容は[JWF作成・書出しの設計記録](https://github.com/tetsuo-m/jwwkit/blob/main/docs/design/jwf_writing_proposal.md)にあります。
67
+
68
+ ## 根拠
69
+
70
+ - Jw_cadの付属ヘルプとSample.jwfを参照し、JWWへの保存に関する確認結果を分類した。
71
+ - 公式配布:https://www.jwcad.net/download.htm
72
+ - 公式サイトの相談記録(同梱説明との照合に使用):https://www.jwcad.net/log/infox3/infox3-0707-12/thread10524.htm 、https://www.jwcad.net/log/consult2/consult2-0610-12/thread17978.htm 。主根拠は現地同梱Help/Sampleと実ファイル・確定JWW欄であり、古い掲示板だけで現行値を断定しない。
73
+
74
+ ## 別PCでの個人設定の用意
75
+
76
+ 参照JWFとAI_settings_summary.jsonは利用者がローカルに用意し、元JWFのSHAと要約の対応を確認する。JWF・要約・設定値・診断ログは図面と同じ扱いでローカルに保管する。ファイルの移動や変更があれば、採用する参照とSHAを利用者と確認し直す。印刷色の宣言だけから描画状態やJWW読込み時の優先関係を推測しない。