jwwkit 0.2.0__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.
- jwwkit-0.2.0/LICENSE +21 -0
- jwwkit-0.2.0/MANIFEST.in +5 -0
- jwwkit-0.2.0/PKG-INFO +174 -0
- jwwkit-0.2.0/README.md +155 -0
- jwwkit-0.2.0/THIRD_PARTY_NOTICES.md +51 -0
- jwwkit-0.2.0/pyproject.toml +39 -0
- jwwkit-0.2.0/setup.cfg +4 -0
- jwwkit-0.2.0/src/jwwkit/__init__.py +14 -0
- jwwkit-0.2.0/src/jwwkit/__main__.py +4 -0
- jwwkit-0.2.0/src/jwwkit/_commands/__init__.py +1 -0
- jwwkit-0.2.0/src/jwwkit/_commands/_integrity.py +55 -0
- jwwkit-0.2.0/src/jwwkit/_commands/check_installation.py +484 -0
- jwwkit-0.2.0/src/jwwkit/_commands/compare_drawings.py +29 -0
- jwwkit-0.2.0/src/jwwkit/_commands/inspect_jwf.py +24 -0
- jwwkit-0.2.0/src/jwwkit/_commands/recognize_planar_tategu.py +20 -0
- jwwkit-0.2.0/src/jwwkit/_commands/summarize_drawing.py +16 -0
- jwwkit-0.2.0/src/jwwkit/_comparison_composites.py +179 -0
- jwwkit-0.2.0/src/jwwkit/_edit_result_core.py +175 -0
- jwwkit-0.2.0/src/jwwkit/_ezjww_adapter.py +12 -0
- jwwkit-0.2.0/src/jwwkit/_geometry_engine.py +204 -0
- jwwkit-0.2.0/src/jwwkit/_geometry_math.py +93 -0
- jwwkit-0.2.0/src/jwwkit/_normalization_inspection.py +83 -0
- jwwkit-0.2.0/src/jwwkit/_replacement_contract.py +161 -0
- jwwkit-0.2.0/src/jwwkit/_resources.py +23 -0
- jwwkit-0.2.0/src/jwwkit/_spatial_distance.py +95 -0
- jwwkit-0.2.0/src/jwwkit/_spatial_query.py +34 -0
- jwwkit-0.2.0/src/jwwkit/_tategu_features.py +201 -0
- jwwkit-0.2.0/src/jwwkit/_tategu_geometry.py +108 -0
- jwwkit-0.2.0/src/jwwkit/alignment.py +85 -0
- jwwkit-0.2.0/src/jwwkit/cad_model.py +5 -0
- jwwkit-0.2.0/src/jwwkit/cli.py +40 -0
- jwwkit-0.2.0/src/jwwkit/drawing_comparison.py +430 -0
- jwwkit-0.2.0/src/jwwkit/edit_result.py +136 -0
- jwwkit-0.2.0/src/jwwkit/geometry_view.py +141 -0
- jwwkit-0.2.0/src/jwwkit/guides/AGENTS.md +47 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/api_list.md +1944 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/common_edit_result_coverage.md +40 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/drawing_comparison.md +79 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/edit_results.md +59 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/geometry_view.md +64 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/jwf_key_catalog.md +244 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/jwf_readonly.md +76 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/plan_api_coverage.md +75 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/read_view.md +89 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/reading_to_editing.md +100 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/schema_normalization.md +64 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/search_queries.md +95 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/spatial_search.md +77 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/tategu_recognition.md +40 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/text_equivalence.md +42 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/usage_guide.md +604 -0
- jwwkit-0.2.0/src/jwwkit/guides/docs/workflow_settings.md +95 -0
- jwwkit-0.2.0/src/jwwkit/hatch_geometry.py +77 -0
- jwwkit-0.2.0/src/jwwkit/jwf.py +202 -0
- jwwkit-0.2.0/src/jwwkit/legacy_document.py +2 -0
- jwwkit-0.2.0/src/jwwkit/line_document.py +14 -0
- jwwkit-0.2.0/src/jwwkit/model/__init__.py +1 -0
- jwwkit-0.2.0/src/jwwkit/model/base.py +15 -0
- jwwkit-0.2.0/src/jwwkit/model/block_definition.py +32 -0
- jwwkit-0.2.0/src/jwwkit/model/block_names.py +41 -0
- jwwkit-0.2.0/src/jwwkit/model/block_operations.py +154 -0
- jwwkit-0.2.0/src/jwwkit/model/block_reference.py +39 -0
- jwwkit-0.2.0/src/jwwkit/model/circle.py +44 -0
- jwwkit-0.2.0/src/jwwkit/model/circular_solid.py +72 -0
- jwwkit-0.2.0/src/jwwkit/model/common_entities.py +34 -0
- jwwkit-0.2.0/src/jwwkit/model/dimension.py +49 -0
- jwwkit-0.2.0/src/jwwkit/model/display_state.py +46 -0
- jwwkit-0.2.0/src/jwwkit/model/document.py +585 -0
- jwwkit-0.2.0/src/jwwkit/model/editing.py +270 -0
- jwwkit-0.2.0/src/jwwkit/model/group_audit.py +91 -0
- jwwkit-0.2.0/src/jwwkit/model/group_import.py +249 -0
- jwwkit-0.2.0/src/jwwkit/model/line.py +31 -0
- jwwkit-0.2.0/src/jwwkit/model/point.py +41 -0
- jwwkit-0.2.0/src/jwwkit/model/preflight.py +120 -0
- jwwkit-0.2.0/src/jwwkit/model/preset_rigid.py +42 -0
- jwwkit-0.2.0/src/jwwkit/model/query.py +270 -0
- jwwkit-0.2.0/src/jwwkit/model/query_fields.py +189 -0
- jwwkit-0.2.0/src/jwwkit/model/query_regex_worker.py +20 -0
- jwwkit-0.2.0/src/jwwkit/model/query_text.py +116 -0
- jwwkit-0.2.0/src/jwwkit/model/rigid_audit.py +66 -0
- jwwkit-0.2.0/src/jwwkit/model/solid.py +51 -0
- jwwkit-0.2.0/src/jwwkit/model/spatial.py +99 -0
- jwwkit-0.2.0/src/jwwkit/model/summary.py +93 -0
- jwwkit-0.2.0/src/jwwkit/model/text.py +49 -0
- jwwkit-0.2.0/src/jwwkit/model/text_metrics.py +78 -0
- jwwkit-0.2.0/src/jwwkit/model/transformations.py +176 -0
- jwwkit-0.2.0/src/jwwkit/normalization.py +287 -0
- jwwkit-0.2.0/src/jwwkit/read_view.py +298 -0
- jwwkit-0.2.0/src/jwwkit/reader/__init__.py +1 -0
- jwwkit-0.2.0/src/jwwkit/reader/archive.py +299 -0
- jwwkit-0.2.0/src/jwwkit/reader/images.py +48 -0
- jwwkit-0.2.0/src/jwwkit/reader/jws.py +175 -0
- jwwkit-0.2.0/src/jwwkit/reader/jws_placement.py +78 -0
- jwwkit-0.2.0/src/jwwkit/reader/sxf.py +51 -0
- jwwkit-0.2.0/src/jwwkit/reader/template_names.py +22 -0
- jwwkit-0.2.0/src/jwwkit/reader/text_presets.py +23 -0
- jwwkit-0.2.0/src/jwwkit/record_reader.py +2 -0
- jwwkit-0.2.0/src/jwwkit/replacement_workflow.py +39 -0
- jwwkit-0.2.0/src/jwwkit/resources/README.md +7 -0
- jwwkit-0.2.0/src/jwwkit/resources/empty_template.jww +0 -0
- jwwkit-0.2.0/src/jwwkit/resources/halfwidth_kana_composition_v1.json +35 -0
- jwwkit-0.2.0/src/jwwkit/resources/header.json +3 -0
- jwwkit-0.2.0/src/jwwkit/resources/jwf_schema.json +925 -0
- jwwkit-0.2.0/src/jwwkit/resources/jww_workflow.example.toml +14 -0
- jwwkit-0.2.0/src/jwwkit/resources/text_equivalence_v1.json +1779 -0
- jwwkit-0.2.0/src/jwwkit/safe_edit.py +454 -0
- jwwkit-0.2.0/src/jwwkit/spatial_search.py +144 -0
- jwwkit-0.2.0/src/jwwkit/tategu_recognition.py +181 -0
- jwwkit-0.2.0/src/jwwkit/workflow_settings.py +140 -0
- jwwkit-0.2.0/src/jwwkit/writer/__init__.py +1 -0
- jwwkit-0.2.0/src/jwwkit/writer/header.py +104 -0
- jwwkit-0.2.0/src/jwwkit/writer/legacy_document.py +62 -0
- jwwkit-0.2.0/src/jwwkit/writer/mfc.py +110 -0
- jwwkit-0.2.0/src/jwwkit/writer/preserved.py +265 -0
- jwwkit-0.2.0/src/jwwkit/writer/strings.py +19 -0
- jwwkit-0.2.0/src/jwwkit/writer/template_constants.py +9 -0
- jwwkit-0.2.0/src/jwwkit/writer/template_document.py +390 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/PKG-INFO +174 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/SOURCES.txt +121 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/dependency_links.txt +1 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/entry_points.txt +2 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/requires.txt +1 -0
- jwwkit-0.2.0/src/jwwkit.egg-info/top_level.txt +1 -0
jwwkit-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 tetsuo-m
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
jwwkit-0.2.0/MANIFEST.in
ADDED
jwwkit-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jwwkit
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Read, inspect, and safely edit Jw_cad drawing files
|
|
5
|
+
Author: tetsuo-m
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/tetsuo-m/jwwkit
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
12
|
+
Classifier: Topic :: Scientific/Engineering
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
License-File: THIRD_PARTY_NOTICES.md
|
|
17
|
+
Requires-Dist: ezjww<0.3,>=0.2.13
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# jwwkit
|
|
21
|
+
|
|
22
|
+
**既存のJw_cad図面(.jww)を、壊さずに読み書きするためのPythonライブラリ**
|
|
23
|
+
|
|
24
|
+
jwwkitは、Jw_cadの図面ファイル(JWW形式)をPythonから読み込み、編集し、保存するためのライブラリです。
|
|
25
|
+
いちばんの特徴は、**既存の図面を、触っていない部分を一切変えずに編集できること**です。
|
|
26
|
+
何も編集せずに保存すれば元のファイルとバイト単位で一致し、線を1本動かしても、それ以外の要素はそのまま残ります。
|
|
27
|
+
|
|
28
|
+
日本中の設計事務所や現場には、Jw_cadで描かれた膨大な図面があります。
|
|
29
|
+
jwwkitは、それらの図面資産を、AIやプログラムから安全に扱えるようにするために作りました。
|
|
30
|
+
|
|
31
|
+
> **非公式ツールです。** jwwkitはJw_cadの作者とは関係のない、個人による非公式のライブラリです。
|
|
32
|
+
> **jwwkitについて、Jw_cadの作者の方々へ問い合わせることはお控えください。**
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## できること
|
|
37
|
+
|
|
38
|
+
- **読み込み**:線・円・弧・点・文字・ソリッド・寸法・ブロックなどの要素と、レイヤ・グループ・縮尺・線色・線種などの属性の取得
|
|
39
|
+
- **既存図面の安全な編集**:要素の移動・複写・回転・反転・拡大縮小・属性変更・削除・追加、レイヤ名・グループ名・縮尺・表示状態の変更など。編集していない要素は変わりません
|
|
40
|
+
- **登録図形(JWS)**:登録図形(230〜700形式)の読み込みと配置
|
|
41
|
+
- **ブロック**:ブロック定義の読み込み、作成、配置、既存要素のブロック化と置換
|
|
42
|
+
- **グループ(レイヤグループ)ごとの縮尺**に対応(実寸mm・紙面mmの両方で指定可能)
|
|
43
|
+
- **大きな図面**:65,535要素を超える図面に対応
|
|
44
|
+
- **SXF拡張線色・線種**:読み取り、検索、属性変更などの編集
|
|
45
|
+
- **別の図面からのグループの取り込みと、2点による位置合わせ**:建築図だけを新しいものに差し替え、設備のグループはそのまま残す、といった使い方ができます
|
|
46
|
+
- **図面どうしの比較**:設計変更の前後などで、追加・削除・属性の変化・文字の変化を一覧にします
|
|
47
|
+
- **条件検索**:AND/OR/NOT、属性のフラグ、線の向き、長さ・半径、表示状態、文字の前方一致・正規表現、全角半角などの表記揺れ(指定した場合のみ)
|
|
48
|
+
- **形状と位置からの検索**:要素の外形・中心・文字枠の取得、指定した点の近くにある要素・最も近い要素の検索
|
|
49
|
+
- **Jw_cadの環境設定ファイル(.jwf)**の読み取りと比較
|
|
50
|
+
- **他のCADが出力したJWW**:TFAS 14eの出力はそのまま、Rebroの出力は対象のクラス宣言欄の明示的な正規化の後に扱えます
|
|
51
|
+
- **AIに使わせるための安全な編集手順(safe_edit)**:「計画 → 確認・承認 → 実行」の2段階で編集し、意図しない変更を防ぎます。編集の結果は、追加・変更・削除・拒否・注意を共通の形で返します
|
|
52
|
+
- **AI向けの利用ガイド**:AIエージェントにこのライブラリを使わせるときの手引き(`jwwkit guide` で場所を表示)
|
|
53
|
+
|
|
54
|
+
## できないこと・対応していないこと
|
|
55
|
+
|
|
56
|
+
- Jw_cadの全機能・全データの完全な再現は保証しません。未対応の構造を見つけた場合、jwwkitは**推測で処理せず、エラーとして止まります**
|
|
57
|
+
- 新しい図面をゼロから作図する機能や、DXFなど他形式への変換は主な目的ではありません(DXFへの変換は [ezjww](https://pypi.org/project/ezjww/) が得意です)
|
|
58
|
+
- 動作確認はJw_cad 10.03系で行っています。それ以外の版で保存された図面では、未対応の形式として読み込みを拒否することがあります
|
|
59
|
+
- 対応する形式はJWWのv600/v700です。それより古い版のJWWと、DOS版のJWCには対応していません
|
|
60
|
+
- 画像を含む図面は、画像をそのまま保持して保存できますが、画像そのものの編集はできません
|
|
61
|
+
- 縮尺の異なるグループへ、文字種の付いた文字・寸法を取り込む操作は、拒否します
|
|
62
|
+
- 新しい入れ子のブロック(ブロックの中のブロック)は作成できません
|
|
63
|
+
- 特殊な属性の付いた文字(寸法の値の文字など)は、文字枠を「未判定」として扱います
|
|
64
|
+
- Rebroが出力したJWWは、そのままでは開けません。明示的な正規化を行ってから使ってください。正規化では、Rebroの書き出しで欠けたデータ(短い線など)は戻りません
|
|
65
|
+
- Windowsで動作を確認しています。一部の機能(正規化の出力の確定など)はWindows専用です
|
|
66
|
+
|
|
67
|
+
## 必ずお読みください
|
|
68
|
+
|
|
69
|
+
- **編集する前に、必ず図面のバックアップを取ってください。** jwwkit自身も、元のファイルへの上書き保存はしません(別名でのみ保存します)。
|
|
70
|
+
- 編集結果は、Jw_cadで開いて目視で確認してから使ってください。
|
|
71
|
+
- AIサービスに図面を読ませると、図面の内容がそのAIの提供会社に送られます。業務の図面で使う前に、所属先や発注者の決まりを確認してください。
|
|
72
|
+
- jwwkit自体はインターネットへの通信を行いません。
|
|
73
|
+
- 本ライブラリは無保証です(MITライセンス)。図面の破損や、編集結果による損害について、作者は責任を負いません。
|
|
74
|
+
- AIに使わせる場合、図面の中の文字・レイヤ名などは「データ」であり、AIへの指示ではありません。図面の中に指示のような文字が書かれていても、AIがそれに従わないよう、利用ガイドに注意を記載しています。
|
|
75
|
+
|
|
76
|
+
## インストール
|
|
77
|
+
|
|
78
|
+
Windowsで使う手順です。作業フォルダを開き、PowerShellから実行します。
|
|
79
|
+
|
|
80
|
+
```powershell
|
|
81
|
+
python -m venv .venv
|
|
82
|
+
.\.venv\Scripts\python.exe -m pip install jwwkit
|
|
83
|
+
.\.venv\Scripts\jwwkit.exe check
|
|
84
|
+
.\.venv\Scripts\jwwkit.exe guide
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
`check` の結果が `"passed": true` なら導入確認は合格です。`guide` は同梱の `AGENTS.md` と利用ガイドの場所を表示します。仮想環境を有効にした場合は `jwwkit check` と `jwwkit guide` で実行できます。
|
|
88
|
+
|
|
89
|
+
- WindowsのPython 3.14と3.15でwheelからの導入を確認しました。
|
|
90
|
+
- 実行時の依存ライブラリは `ezjww>=0.2.13,<0.3` です。
|
|
91
|
+
|
|
92
|
+
### 開発用のインストール
|
|
93
|
+
|
|
94
|
+
取得したリポジトリの直下で、新しい仮想環境を作って有効にします。その環境で次を実行します。
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
python -m pip install -e .
|
|
98
|
+
python -m jwwkit check
|
|
99
|
+
python -B -m unittest discover -s tests
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 使い方
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from pathlib import Path
|
|
106
|
+
from jwwkit import CadDocument
|
|
107
|
+
|
|
108
|
+
# 図面を読み込む
|
|
109
|
+
drawing_dir = Path("../drawing-work") # ライブラリの外にある作業フォルダに置き換える
|
|
110
|
+
doc = CadDocument.open(drawing_dir / "sample.jww")
|
|
111
|
+
|
|
112
|
+
# 全体の要約(要素数、種類ごとの数、グループ・レイヤごとの内訳など)
|
|
113
|
+
summary = doc.summary()
|
|
114
|
+
print(summary["entity_count"], summary["by_type"])
|
|
115
|
+
|
|
116
|
+
# グループ0の線を探して、属性と座標を見る
|
|
117
|
+
for i in doc.find_entities(entity_type="LINE", layer_group=0):
|
|
118
|
+
e = doc.entities[i]
|
|
119
|
+
print(i, e.attributes["layer"], e.attributes["pen_color"], e.geometry)
|
|
120
|
+
|
|
121
|
+
# 何も編集せずに別名で保存すると、元のファイルとバイト単位で一致します
|
|
122
|
+
doc.save(drawing_dir / "sample_copy.jww")
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
サンプル図面は、今後追加する予定です。それまでは、ご自身で作成した図面でお試しください(業務の図面を使う場合は、必ずバックアップを取ってから)。
|
|
126
|
+
|
|
127
|
+
AIに既存図面の編集を頼む場合、AIが示す計画の内容とSHA256を確かめ、会話で了承を伝えてください。元図面の上書きはできないため、編集結果は別名で保存します。空テンプレートから新規作図を頼む場合は、先に作る内容と保存先を確認します。詳しくは [AGENTS.md](https://github.com/tetsuo-m/jwwkit/blob/main/AGENTS.md) と [利用ガイド](https://github.com/tetsuo-m/jwwkit/blob/main/docs/usage_guide.md) を参照してください。関数の一覧は [API一覧](https://github.com/tetsuo-m/jwwkit/blob/main/docs/api_list.md) を参照してください。
|
|
128
|
+
|
|
129
|
+
### コマンド
|
|
130
|
+
|
|
131
|
+
- `jwwkit summarize --source input.jww --output summary.json` で図面を集計します。
|
|
132
|
+
- `jwwkit compare --left before.jww --right after.jww --output comparison.json` で図面を比較します。
|
|
133
|
+
- `jwwkit inspect-jwf --source settings.jwf --output settings.json` でJWFを読み取ります。
|
|
134
|
+
- `jwwkit recognize-tategu --source input.jww --tolerances tolerances.json --output candidates.json` で建具の候補を抽出します。許容値は [建具候補の抽出](https://github.com/tetsuo-m/jwwkit/blob/main/docs/tategu_recognition.md) を参照してください。
|
|
135
|
+
|
|
136
|
+
出力には新しいファイル名を指定してください。Pythonから手引きの場所を得るには `jwwkit.guide_paths()`、空テンプレートの場所を得るには `jwwkit.template_path()` を使います。
|
|
137
|
+
|
|
138
|
+
## 検証について
|
|
139
|
+
|
|
140
|
+
jwwkitは、業務で安心して使えることを目標に、一つひとつ検証しながら作りました。
|
|
141
|
+
無編集保存でのバイト一致、編集後にJw_cadで開いて再保存できること、DXF・PDF出力での照合など、検証の方法と結果は [VERIFICATION.md](https://github.com/tetsuo-m/jwwkit/blob/main/VERIFICATION.md) にまとめています。
|
|
142
|
+
|
|
143
|
+
## 作った人について
|
|
144
|
+
|
|
145
|
+
電気設備の設計者が、日々の業務を楽にしたいという動機から、AIと一緒に作りました。作者はプログラマーではありません。
|
|
146
|
+
JWW形式は、公開されているファイル形式の資料と、自作の図面の解析、Jw_cad本体で保存した結果との照合をもとに読み解いています。実務の図面は検証にのみ使い、公開していません。
|
|
147
|
+
図面のヘッダーの読み取りと、独自の読み取り結果の照合には、[ezjww](https://pypi.org/project/ezjww/)(MITライセンス)を利用しています。
|
|
148
|
+
Jw_cad本体や付属ファイルは含んでいません。ライブラリの確認用に、図形のない空テンプレートを収録しています。
|
|
149
|
+
|
|
150
|
+
## サポートについて
|
|
151
|
+
|
|
152
|
+
- 不具合や危険な動作は、[非公開の報告手順](https://github.com/tetsuo-m/jwwkit/blob/main/SECURITY.md)に沿って報告してください。改善要望はGitHubのIssueで受け付けます。
|
|
153
|
+
- 返信は不定期です。すべての要望に応えられるとは限りません。
|
|
154
|
+
- 報告や要望に図面は添付しないでください。
|
|
155
|
+
|
|
156
|
+
## 関連プロジェクト
|
|
157
|
+
|
|
158
|
+
JWW形式を扱うオープンソースには、ほかにも次のようなものがあります。目的に合わせて選んでください。
|
|
159
|
+
|
|
160
|
+
- [ezjww](https://pypi.org/project/ezjww/) — JWWの読み込み・新規作成・変換に強いライブラリ(Rust製、Python・TypeScriptから利用可能)。jwwkitも内部で利用しています
|
|
161
|
+
- [zumen](https://pypi.org/project/zumen/) — SXF・JWW・DXF・DWGを読み込み、表示・比較・変換するライブラリ(Rust製、Python・ブラウザから利用可能)
|
|
162
|
+
|
|
163
|
+
## ライセンス
|
|
164
|
+
|
|
165
|
+
[MIT License](https://github.com/tetsuo-m/jwwkit/blob/main/LICENSE) · [第三者のデータと依存ライブラリ](https://github.com/tetsuo-m/jwwkit/blob/main/THIRD_PARTY_NOTICES.md)
|
|
166
|
+
|
|
167
|
+
「Jw_cad」は、その作者の方々に帰属する名称です。
|
|
168
|
+
「Rebro」と「TFAS」は、それぞれの権利者に帰属する名称です。
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## English summary
|
|
173
|
+
|
|
174
|
+
jwwkit is an unofficial Python library for reading and **safely editing existing Jw_cad (.jww) drawings** without altering untouched elements (a no-edit save is byte-identical to the original). It supports registered figures (JWS), blocks, per-group scales, drawings with more than 65,535 elements, SXF extended line colors/types, importing layer groups from another drawing with two-point alignment, drawing comparison, structured search, and a two-step plan/approve/execute editing workflow designed for AI agents. It is tested on Windows with Python 3.14 and 3.15 and with Jw_cad 10.03.6, and uses ezjww (MIT) for header reading and cross-checking. Not affiliated with the authors of Jw_cad — please do not contact them about this library. Always back up your drawings before editing.
|
jwwkit-0.2.0/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# jwwkit
|
|
2
|
+
|
|
3
|
+
**既存のJw_cad図面(.jww)を、壊さずに読み書きするためのPythonライブラリ**
|
|
4
|
+
|
|
5
|
+
jwwkitは、Jw_cadの図面ファイル(JWW形式)をPythonから読み込み、編集し、保存するためのライブラリです。
|
|
6
|
+
いちばんの特徴は、**既存の図面を、触っていない部分を一切変えずに編集できること**です。
|
|
7
|
+
何も編集せずに保存すれば元のファイルとバイト単位で一致し、線を1本動かしても、それ以外の要素はそのまま残ります。
|
|
8
|
+
|
|
9
|
+
日本中の設計事務所や現場には、Jw_cadで描かれた膨大な図面があります。
|
|
10
|
+
jwwkitは、それらの図面資産を、AIやプログラムから安全に扱えるようにするために作りました。
|
|
11
|
+
|
|
12
|
+
> **非公式ツールです。** jwwkitはJw_cadの作者とは関係のない、個人による非公式のライブラリです。
|
|
13
|
+
> **jwwkitについて、Jw_cadの作者の方々へ問い合わせることはお控えください。**
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## できること
|
|
18
|
+
|
|
19
|
+
- **読み込み**:線・円・弧・点・文字・ソリッド・寸法・ブロックなどの要素と、レイヤ・グループ・縮尺・線色・線種などの属性の取得
|
|
20
|
+
- **既存図面の安全な編集**:要素の移動・複写・回転・反転・拡大縮小・属性変更・削除・追加、レイヤ名・グループ名・縮尺・表示状態の変更など。編集していない要素は変わりません
|
|
21
|
+
- **登録図形(JWS)**:登録図形(230〜700形式)の読み込みと配置
|
|
22
|
+
- **ブロック**:ブロック定義の読み込み、作成、配置、既存要素のブロック化と置換
|
|
23
|
+
- **グループ(レイヤグループ)ごとの縮尺**に対応(実寸mm・紙面mmの両方で指定可能)
|
|
24
|
+
- **大きな図面**:65,535要素を超える図面に対応
|
|
25
|
+
- **SXF拡張線色・線種**:読み取り、検索、属性変更などの編集
|
|
26
|
+
- **別の図面からのグループの取り込みと、2点による位置合わせ**:建築図だけを新しいものに差し替え、設備のグループはそのまま残す、といった使い方ができます
|
|
27
|
+
- **図面どうしの比較**:設計変更の前後などで、追加・削除・属性の変化・文字の変化を一覧にします
|
|
28
|
+
- **条件検索**:AND/OR/NOT、属性のフラグ、線の向き、長さ・半径、表示状態、文字の前方一致・正規表現、全角半角などの表記揺れ(指定した場合のみ)
|
|
29
|
+
- **形状と位置からの検索**:要素の外形・中心・文字枠の取得、指定した点の近くにある要素・最も近い要素の検索
|
|
30
|
+
- **Jw_cadの環境設定ファイル(.jwf)**の読み取りと比較
|
|
31
|
+
- **他のCADが出力したJWW**:TFAS 14eの出力はそのまま、Rebroの出力は対象のクラス宣言欄の明示的な正規化の後に扱えます
|
|
32
|
+
- **AIに使わせるための安全な編集手順(safe_edit)**:「計画 → 確認・承認 → 実行」の2段階で編集し、意図しない変更を防ぎます。編集の結果は、追加・変更・削除・拒否・注意を共通の形で返します
|
|
33
|
+
- **AI向けの利用ガイド**:AIエージェントにこのライブラリを使わせるときの手引き(`jwwkit guide` で場所を表示)
|
|
34
|
+
|
|
35
|
+
## できないこと・対応していないこと
|
|
36
|
+
|
|
37
|
+
- Jw_cadの全機能・全データの完全な再現は保証しません。未対応の構造を見つけた場合、jwwkitは**推測で処理せず、エラーとして止まります**
|
|
38
|
+
- 新しい図面をゼロから作図する機能や、DXFなど他形式への変換は主な目的ではありません(DXFへの変換は [ezjww](https://pypi.org/project/ezjww/) が得意です)
|
|
39
|
+
- 動作確認はJw_cad 10.03系で行っています。それ以外の版で保存された図面では、未対応の形式として読み込みを拒否することがあります
|
|
40
|
+
- 対応する形式はJWWのv600/v700です。それより古い版のJWWと、DOS版のJWCには対応していません
|
|
41
|
+
- 画像を含む図面は、画像をそのまま保持して保存できますが、画像そのものの編集はできません
|
|
42
|
+
- 縮尺の異なるグループへ、文字種の付いた文字・寸法を取り込む操作は、拒否します
|
|
43
|
+
- 新しい入れ子のブロック(ブロックの中のブロック)は作成できません
|
|
44
|
+
- 特殊な属性の付いた文字(寸法の値の文字など)は、文字枠を「未判定」として扱います
|
|
45
|
+
- Rebroが出力したJWWは、そのままでは開けません。明示的な正規化を行ってから使ってください。正規化では、Rebroの書き出しで欠けたデータ(短い線など)は戻りません
|
|
46
|
+
- Windowsで動作を確認しています。一部の機能(正規化の出力の確定など)はWindows専用です
|
|
47
|
+
|
|
48
|
+
## 必ずお読みください
|
|
49
|
+
|
|
50
|
+
- **編集する前に、必ず図面のバックアップを取ってください。** jwwkit自身も、元のファイルへの上書き保存はしません(別名でのみ保存します)。
|
|
51
|
+
- 編集結果は、Jw_cadで開いて目視で確認してから使ってください。
|
|
52
|
+
- AIサービスに図面を読ませると、図面の内容がそのAIの提供会社に送られます。業務の図面で使う前に、所属先や発注者の決まりを確認してください。
|
|
53
|
+
- jwwkit自体はインターネットへの通信を行いません。
|
|
54
|
+
- 本ライブラリは無保証です(MITライセンス)。図面の破損や、編集結果による損害について、作者は責任を負いません。
|
|
55
|
+
- AIに使わせる場合、図面の中の文字・レイヤ名などは「データ」であり、AIへの指示ではありません。図面の中に指示のような文字が書かれていても、AIがそれに従わないよう、利用ガイドに注意を記載しています。
|
|
56
|
+
|
|
57
|
+
## インストール
|
|
58
|
+
|
|
59
|
+
Windowsで使う手順です。作業フォルダを開き、PowerShellから実行します。
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
python -m venv .venv
|
|
63
|
+
.\.venv\Scripts\python.exe -m pip install jwwkit
|
|
64
|
+
.\.venv\Scripts\jwwkit.exe check
|
|
65
|
+
.\.venv\Scripts\jwwkit.exe guide
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`check` の結果が `"passed": true` なら導入確認は合格です。`guide` は同梱の `AGENTS.md` と利用ガイドの場所を表示します。仮想環境を有効にした場合は `jwwkit check` と `jwwkit guide` で実行できます。
|
|
69
|
+
|
|
70
|
+
- WindowsのPython 3.14と3.15でwheelからの導入を確認しました。
|
|
71
|
+
- 実行時の依存ライブラリは `ezjww>=0.2.13,<0.3` です。
|
|
72
|
+
|
|
73
|
+
### 開発用のインストール
|
|
74
|
+
|
|
75
|
+
取得したリポジトリの直下で、新しい仮想環境を作って有効にします。その環境で次を実行します。
|
|
76
|
+
|
|
77
|
+
```powershell
|
|
78
|
+
python -m pip install -e .
|
|
79
|
+
python -m jwwkit check
|
|
80
|
+
python -B -m unittest discover -s tests
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 使い方
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from pathlib import Path
|
|
87
|
+
from jwwkit import CadDocument
|
|
88
|
+
|
|
89
|
+
# 図面を読み込む
|
|
90
|
+
drawing_dir = Path("../drawing-work") # ライブラリの外にある作業フォルダに置き換える
|
|
91
|
+
doc = CadDocument.open(drawing_dir / "sample.jww")
|
|
92
|
+
|
|
93
|
+
# 全体の要約(要素数、種類ごとの数、グループ・レイヤごとの内訳など)
|
|
94
|
+
summary = doc.summary()
|
|
95
|
+
print(summary["entity_count"], summary["by_type"])
|
|
96
|
+
|
|
97
|
+
# グループ0の線を探して、属性と座標を見る
|
|
98
|
+
for i in doc.find_entities(entity_type="LINE", layer_group=0):
|
|
99
|
+
e = doc.entities[i]
|
|
100
|
+
print(i, e.attributes["layer"], e.attributes["pen_color"], e.geometry)
|
|
101
|
+
|
|
102
|
+
# 何も編集せずに別名で保存すると、元のファイルとバイト単位で一致します
|
|
103
|
+
doc.save(drawing_dir / "sample_copy.jww")
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
サンプル図面は、今後追加する予定です。それまでは、ご自身で作成した図面でお試しください(業務の図面を使う場合は、必ずバックアップを取ってから)。
|
|
107
|
+
|
|
108
|
+
AIに既存図面の編集を頼む場合、AIが示す計画の内容とSHA256を確かめ、会話で了承を伝えてください。元図面の上書きはできないため、編集結果は別名で保存します。空テンプレートから新規作図を頼む場合は、先に作る内容と保存先を確認します。詳しくは [AGENTS.md](https://github.com/tetsuo-m/jwwkit/blob/main/AGENTS.md) と [利用ガイド](https://github.com/tetsuo-m/jwwkit/blob/main/docs/usage_guide.md) を参照してください。関数の一覧は [API一覧](https://github.com/tetsuo-m/jwwkit/blob/main/docs/api_list.md) を参照してください。
|
|
109
|
+
|
|
110
|
+
### コマンド
|
|
111
|
+
|
|
112
|
+
- `jwwkit summarize --source input.jww --output summary.json` で図面を集計します。
|
|
113
|
+
- `jwwkit compare --left before.jww --right after.jww --output comparison.json` で図面を比較します。
|
|
114
|
+
- `jwwkit inspect-jwf --source settings.jwf --output settings.json` でJWFを読み取ります。
|
|
115
|
+
- `jwwkit recognize-tategu --source input.jww --tolerances tolerances.json --output candidates.json` で建具の候補を抽出します。許容値は [建具候補の抽出](https://github.com/tetsuo-m/jwwkit/blob/main/docs/tategu_recognition.md) を参照してください。
|
|
116
|
+
|
|
117
|
+
出力には新しいファイル名を指定してください。Pythonから手引きの場所を得るには `jwwkit.guide_paths()`、空テンプレートの場所を得るには `jwwkit.template_path()` を使います。
|
|
118
|
+
|
|
119
|
+
## 検証について
|
|
120
|
+
|
|
121
|
+
jwwkitは、業務で安心して使えることを目標に、一つひとつ検証しながら作りました。
|
|
122
|
+
無編集保存でのバイト一致、編集後にJw_cadで開いて再保存できること、DXF・PDF出力での照合など、検証の方法と結果は [VERIFICATION.md](https://github.com/tetsuo-m/jwwkit/blob/main/VERIFICATION.md) にまとめています。
|
|
123
|
+
|
|
124
|
+
## 作った人について
|
|
125
|
+
|
|
126
|
+
電気設備の設計者が、日々の業務を楽にしたいという動機から、AIと一緒に作りました。作者はプログラマーではありません。
|
|
127
|
+
JWW形式は、公開されているファイル形式の資料と、自作の図面の解析、Jw_cad本体で保存した結果との照合をもとに読み解いています。実務の図面は検証にのみ使い、公開していません。
|
|
128
|
+
図面のヘッダーの読み取りと、独自の読み取り結果の照合には、[ezjww](https://pypi.org/project/ezjww/)(MITライセンス)を利用しています。
|
|
129
|
+
Jw_cad本体や付属ファイルは含んでいません。ライブラリの確認用に、図形のない空テンプレートを収録しています。
|
|
130
|
+
|
|
131
|
+
## サポートについて
|
|
132
|
+
|
|
133
|
+
- 不具合や危険な動作は、[非公開の報告手順](https://github.com/tetsuo-m/jwwkit/blob/main/SECURITY.md)に沿って報告してください。改善要望はGitHubのIssueで受け付けます。
|
|
134
|
+
- 返信は不定期です。すべての要望に応えられるとは限りません。
|
|
135
|
+
- 報告や要望に図面は添付しないでください。
|
|
136
|
+
|
|
137
|
+
## 関連プロジェクト
|
|
138
|
+
|
|
139
|
+
JWW形式を扱うオープンソースには、ほかにも次のようなものがあります。目的に合わせて選んでください。
|
|
140
|
+
|
|
141
|
+
- [ezjww](https://pypi.org/project/ezjww/) — JWWの読み込み・新規作成・変換に強いライブラリ(Rust製、Python・TypeScriptから利用可能)。jwwkitも内部で利用しています
|
|
142
|
+
- [zumen](https://pypi.org/project/zumen/) — SXF・JWW・DXF・DWGを読み込み、表示・比較・変換するライブラリ(Rust製、Python・ブラウザから利用可能)
|
|
143
|
+
|
|
144
|
+
## ライセンス
|
|
145
|
+
|
|
146
|
+
[MIT License](https://github.com/tetsuo-m/jwwkit/blob/main/LICENSE) · [第三者のデータと依存ライブラリ](https://github.com/tetsuo-m/jwwkit/blob/main/THIRD_PARTY_NOTICES.md)
|
|
147
|
+
|
|
148
|
+
「Jw_cad」は、その作者の方々に帰属する名称です。
|
|
149
|
+
「Rebro」と「TFAS」は、それぞれの権利者に帰属する名称です。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## English summary
|
|
154
|
+
|
|
155
|
+
jwwkit is an unofficial Python library for reading and **safely editing existing Jw_cad (.jww) drawings** without altering untouched elements (a no-edit save is byte-identical to the original). It supports registered figures (JWS), blocks, per-group scales, drawings with more than 65,535 elements, SXF extended line colors/types, importing layer groups from another drawing with two-point alignment, drawing comparison, structured search, and a two-step plan/approve/execute editing workflow designed for AI agents. It is tested on Windows with Python 3.14 and 3.15 and with Jw_cad 10.03.6, and uses ezjww (MIT) for header reading and cross-checking. Not affiliated with the authors of Jw_cad — please do not contact them about this library. Always back up your drawings before editing.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 第三者のデータと依存ライブラリ
|
|
2
|
+
|
|
3
|
+
## Unicode Character Database 16.0.0
|
|
4
|
+
|
|
5
|
+
文字検索の固定対応表には、Unicode Character Database 16.0.0に由来するデータを含みます。Unicode, Inc. © 2024。対象は `src/jwwkit/resources/text_equivalence_v1.json`、`src/jwwkit/resources/halfwidth_kana_composition_v1.json` と、`docs/design/text_equivalence_proposal.md`、`docs/design/text_equivalence_proposal.json` に掲載した対応表です。case folding、空白の分類、半角カナの合成などに使っています。対応表はjwwkitの検索用に抽出・整形したものです。[Unicode 16.0.0 UCD](https://www.unicode.org/Public/16.0.0/ucd/ReadMe.txt) · [CaseFolding.txt](https://www.unicode.org/Public/16.0.0/ucd/CaseFolding.txt) · [Unicode License v3](https://www.unicode.org/license.txt)
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
UNICODE LICENSE V3
|
|
9
|
+
|
|
10
|
+
COPYRIGHT AND PERMISSION NOTICE
|
|
11
|
+
|
|
12
|
+
Copyright © 1991-2026 Unicode, Inc.
|
|
13
|
+
|
|
14
|
+
NOTICE TO USER: Carefully read the following legal agreement. BY
|
|
15
|
+
DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
|
|
16
|
+
SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
|
|
17
|
+
TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
|
|
18
|
+
DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
|
|
19
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
|
20
|
+
copy of data files and any associated documentation (the "Data Files") or
|
|
21
|
+
software and any associated documentation (the "Software") to deal in the
|
|
22
|
+
Data Files or Software without restriction, including without limitation
|
|
23
|
+
the rights to use, copy, modify, merge, publish, distribute, and/or sell
|
|
24
|
+
copies of the Data Files or Software, and to permit persons to whom the
|
|
25
|
+
Data Files or Software are furnished to do so, provided that either (a)
|
|
26
|
+
this copyright and permission notice appear with all copies of the Data
|
|
27
|
+
Files or Software, or (b) this copyright and permission notice appear in
|
|
28
|
+
associated Documentation.
|
|
29
|
+
THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
|
30
|
+
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
31
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
32
|
+
THIRD PARTY RIGHTS.
|
|
33
|
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
|
|
34
|
+
BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
|
|
35
|
+
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
36
|
+
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
37
|
+
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
|
|
38
|
+
FILES OR SOFTWARE.
|
|
39
|
+
Except as contained in this notice, the name of a copyright holder shall
|
|
40
|
+
not be used in advertising or otherwise to promote the sale, use or other
|
|
41
|
+
dealings in these Data Files or Software without prior written
|
|
42
|
+
authorization of the copyright holder.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Pythonの依存ライブラリ
|
|
46
|
+
|
|
47
|
+
|依存|固定版|ライセンス|配布元|
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
|ezjww|0.2.13|MIT|[ezjww 0.2.13](https://pypi.org/project/ezjww/0.2.13/)|
|
|
50
|
+
|
|
51
|
+
依存のコードとバイナリは各配布元から取得します。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "jwwkit"
|
|
7
|
+
version = "0.2.0"
|
|
8
|
+
description = "Read, inspect, and safely edit Jw_cad drawing files"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE", "THIRD_PARTY_NOTICES.md"]
|
|
13
|
+
authors = [{name = "tetsuo-m"}]
|
|
14
|
+
dependencies = ["ezjww>=0.2.13,<0.3"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Operating System :: Microsoft :: Windows",
|
|
18
|
+
"Programming Language :: Python :: 3",
|
|
19
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
20
|
+
"Topic :: Scientific/Engineering",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[project.scripts]
|
|
24
|
+
jwwkit = "jwwkit.cli:main"
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Repository = "https://github.com/tetsuo-m/jwwkit"
|
|
28
|
+
|
|
29
|
+
[tool.setuptools]
|
|
30
|
+
package-dir = {"" = "src"}
|
|
31
|
+
include-package-data = false
|
|
32
|
+
|
|
33
|
+
[tool.setuptools.packages.find]
|
|
34
|
+
where = ["src"]
|
|
35
|
+
include = ["jwwkit", "jwwkit.*"]
|
|
36
|
+
namespaces = false
|
|
37
|
+
|
|
38
|
+
[tool.setuptools.package-data]
|
|
39
|
+
jwwkit = ["resources/*.jww", "resources/*.json", "resources/*.md", "resources/*.toml", "guides/AGENTS.md", "guides/docs/*.md"]
|
jwwkit-0.2.0/setup.cfg
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Read, inspect and safely edit Jw_cad drawings."""
|
|
2
|
+
from ._resources import guide_paths, template_path
|
|
3
|
+
from .cad_model import CadBlockDefinition, CadDocument, CadEntity, JwsDocument
|
|
4
|
+
from .jwf import JwfDocument, JwfSetting, jwf_setting_catalog
|
|
5
|
+
from .legacy_document import LegacyDocument
|
|
6
|
+
from .line_document import (
|
|
7
|
+
BlockDefinition, BlockReference, Circle, Dimension, JwwDocument, Line, Point, Solid, Text,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"BlockDefinition", "BlockReference", "CadBlockDefinition", "CadDocument", "CadEntity",
|
|
12
|
+
"Circle", "Dimension", "JwfDocument", "JwfSetting", "JwsDocument", "JwwDocument",
|
|
13
|
+
"LegacyDocument", "Line", "Point", "Solid", "Text", "guide_paths", "jwf_setting_catalog", "template_path",
|
|
14
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Command implementations for jwwkit."""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Offline checks for package data and the installed wheel's RECORD."""
|
|
2
|
+
import base64
|
|
3
|
+
import hashlib
|
|
4
|
+
from importlib import metadata
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from jwwkit import template_path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
_TEMPLATE_SHA256 = "0913d5f6755b7038c11cda8be75c2502511ce85a007f9bcc2f10df049f6eff1e"
|
|
11
|
+
_DRAWINGS = {".jww", ".jws", ".jwc", ".jwk", ".jwf", ".dxf", ".pdf"}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def check_installed_files() -> int:
|
|
15
|
+
template = template_path()
|
|
16
|
+
package_root = template.parent.parent
|
|
17
|
+
if hashlib.sha256(template.read_bytes()).hexdigest() != _TEMPLATE_SHA256:
|
|
18
|
+
raise ValueError("Installed empty template hash mismatch")
|
|
19
|
+
|
|
20
|
+
files = set()
|
|
21
|
+
for path in package_root.rglob("*"):
|
|
22
|
+
if "__pycache__" in path.parts:
|
|
23
|
+
continue
|
|
24
|
+
if path.is_symlink() or getattr(path.stat(), "st_file_attributes", 0) & 0x400:
|
|
25
|
+
raise ValueError(f"Link or reparse point in jwwkit: {path}")
|
|
26
|
+
if not path.is_file():
|
|
27
|
+
continue
|
|
28
|
+
if path.name.casefold() in {"desktop.ini", "thumbs.db"} or path.suffix == ".pyc":
|
|
29
|
+
continue
|
|
30
|
+
if path.name.casefold() == "ai_settings_summary.json":
|
|
31
|
+
raise ValueError(f"Personal JWF summary in jwwkit: {path}")
|
|
32
|
+
if path.suffix.casefold() in _DRAWINGS and path != template:
|
|
33
|
+
raise ValueError(f"Unexpected drawing in jwwkit: {path}")
|
|
34
|
+
files.add(path)
|
|
35
|
+
|
|
36
|
+
distribution = metadata.distribution("jwwkit")
|
|
37
|
+
records = {
|
|
38
|
+
Path(item.locate()): item
|
|
39
|
+
for item in distribution.files or ()
|
|
40
|
+
if item.parts[0] == "jwwkit" and "__pycache__" not in item.parts
|
|
41
|
+
}
|
|
42
|
+
# Editable installations record the path hook and metadata, not package files.
|
|
43
|
+
if records:
|
|
44
|
+
if set(records) != files:
|
|
45
|
+
extra = sorted(str(path.relative_to(package_root)) for path in files - records.keys())
|
|
46
|
+
missing = sorted(str(path.relative_to(package_root)) for path in records.keys() - files)
|
|
47
|
+
raise ValueError(f"Unexpected or missing installed jwwkit files: extra={extra}, missing={missing}")
|
|
48
|
+
for path, record in records.items():
|
|
49
|
+
data = path.read_bytes()
|
|
50
|
+
if record.hash is None or record.size != len(data):
|
|
51
|
+
raise ValueError(f"Installed jwwkit file size or RECORD mismatch: {path.name}")
|
|
52
|
+
digest = hashlib.new(record.hash.mode, data).digest()
|
|
53
|
+
if base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ascii") != record.hash.value:
|
|
54
|
+
raise ValueError(f"Installed jwwkit file hash mismatch: {path.name}")
|
|
55
|
+
return len(files)
|