This commit is contained in:
2025-05-08 09:43:02 +02:00
4 changed files with 99 additions and 70 deletions
+4 -2
View File
@@ -66,14 +66,16 @@
] ]
}, },
{ {
"name": "draw cable dxf from easy.dxf", "name": "draw cable dxf from easy.json",
"type": "debugpy", "type": "debugpy",
"request": "launch", "request": "launch",
"program": "${file}", "program": "${file}",
"console": "integratedTerminal", "console": "integratedTerminal",
"justMyCode": true, "justMyCode": true,
"args": [ "args": [
"--filename", "--json",
"easy.json",
"--dxf",
"easy.dxf" "easy.dxf"
] ]
} }
+1
View File
@@ -9,6 +9,7 @@ set PROJECT_LIB=%PROJECT%\lib
set PROJECT_DATA=%PROJECT%\data set PROJECT_DATA=%PROJECT%\data
set PROJECT_WORK=%PROJECT%\work set PROJECT_WORK=%PROJECT%\work
set PROJECT_LOG=%PROJECT%\log set PROJECT_LOG=%PROJECT%\log
set PROJECT_TEST=%PROJECT%\testdata
if not exist %PROJECT%\work mkdir %PROJECT%\work if not exist %PROJECT%\work mkdir %PROJECT%\work
if not exist %PROJECT%\log mkdir %PROJECT%\log if not exist %PROJECT%\log mkdir %PROJECT%\log
+65 -68
View File
@@ -1,11 +1,13 @@
import argparse import argparse
import ezdxf import ezdxf
import random # needed for random placing points import json
from ezdxf.enums import TextEntityAlignment
import os.path import os.path
from dataclasses import dataclass, asdict, fields from dataclasses import dataclass, asdict, fields
from dacite import from_dict from dacite import from_dict
from typing import List from typing import List
from datetime import datetime
import shutil
@dataclass @dataclass
@@ -16,91 +18,86 @@ class Point:
@dataclass @dataclass
class Polyline: class Polyline:
id: str id: str
punkte: List[Point] coords: List[Point]
def to_tuple(self):
ret = list()
for p in self.coords:
ret.append( (p.x,p.y) )
return ret
@dataclass
class Polylines:
kabel: List[Polyline]
def get_random_point():
"""Returns random x, y coordinates."""
x = random.randint(-100, 100)
y = random.randint(-100, 100)
return x, y
# # Create a block with the name 'FLAG' def add_polyline(msp, points:Polyline, dxf_attribs):
def create_block(doc): pts = points.to_tuple()
flag = doc.blocks.new(name='FLAG') pline = msp.add_lwpolyline(points=pts, dxfattribs=dxf_attribs)
pline.rgb = (255, 128, 0)
# Add DXF entities to the block 'FLAG'. def new_dxf(json_file, dxf_file, out_path):
# The default base point (= insertion point) of the block is (0, 0). """ creates a new dxf file with a polyline inside which is created by the given json file
flag.add_lwpolyline([(0, 0), (0, 5), (4, 3), (0, 3)]) # the flag symbol as 2D polyline """
flag.add_circle((0, 0), .4, dxfattribs={'color': 2}) # mark the base point with a circle with open(json_file, encoding='utf-8') as fh:
return flag data = json.load(fh)
def create_points(msp): anlage = from_dict(
# Get 50 random placing points. data_class=Polylines,
placing_points = [get_random_point() for _ in range(50)] data=data
)
for point in placing_points: #print(anlage)
# Every flag has a different scaling and a rotation of -15 deg.
random_scale = 0.5 + random.random() * 2.0
# Add a block reference to the block named 'FLAG' at the coordinates 'point'.
msp.add_blockref('FLAG', point, dxfattribs={
'xscale': random_scale,
'yscale': random_scale,
'rotation': -15
})
def add_text(msp):
# Use method set_placement() to define the TEXT alignment, because the
# relations between the DXF attributes 'halign', 'valign', 'insert' and
# 'align_point' are tricky.
msp.add_text("A Simple Text").set_placement(
(2, 3),
align=TextEntityAlignment.MIDDLE_RIGHT
)
# Using a predefined text style:
msp.add_text(
"Text Style Example: Liberation Serif",
height=0.35,
dxfattribs={"style": "LiberationSerif"}
).set_placement((2, 6), align=TextEntityAlignment.LEFT)
def add_polyline(msp):
# add a LINE entity
msp.add_line((0, 0), (50, 0))
points = [(0, 0), (3, 0), (6, 3), (6, 6)]
msp.add_lwpolyline(points)
def new_dxf(path):
# Create a new drawing in the DXF format of AutoCAD 2010 # Create a new drawing in the DXF format of AutoCAD 2010
doc = ezdxf.new('R2018', setup=True) #doc = ezdxf.new('R2018', setup=True)
# 1. Bestehende DXF-Datei laden
doc = ezdxf.readfile(dxf_file)
msp = doc.modelspace()
# 2. Layer mit Zeitstempel erstellen (z.B. "Layer_2025-05-07_14-30")
timestamp = datetime.now().strftime("Kabel_%Y-%m-%d_%H-%M")
if timestamp not in doc.layers:
doc.layers.add(name=timestamp, color=7)
# add new entities to the modelspace # add new entities to the modelspace
msp = doc.modelspace() msp = doc.modelspace()
# # Beispiel für Text und Polyline # # Beispiel für Text und Polyline
# add_text(msp) # add_text(msp)
# add_polyline(msp) dxfattribs={"layer": timestamp}
for pl in anlage.kabel:
add_polyline(msp, pl, dxfattribs)
# Beispiel für Block doc.saveas(out_path)
create_block(doc)
create_points(msp)
doc.saveas(path)
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description='draws a dxf file with the given cable coordinates', prog='drawdxf') parser = argparse.ArgumentParser(description='draws a dxf file with the given cable coordinates', prog='drawdxf')
parser.add_argument('-f', '--filename', action='store', required=True, default="easy.dwg", help='which file should be fetched', metavar='myfile.dwg') parser.add_argument('-j', '--jsonfile', action='store', required=True, help='this json file contains all cables and its coordinates which should be drawn', metavar='myfile.json')
parser.add_argument('-d', '--dxf', action='store', required=True, help='this dxf drawing will be copied and the new layer with the cables will be added', metavar='myfile.dxf')
args = parser.parse_args() args = parser.parse_args()
work_dir = os.environ.get('PROJECT_WORK') work_dir = os.fspath(os.environ.get('PROJECT_WORK'))
filename = os.fspath(args.filename) jfile = args.jsonfile
path = os.path.join(work_dir, filename + '_cable.dxf') dxf_file = args.dxf
if args.filename: if args.jsonfile and args.dxf:
res_pos = new_dxf(filename) jpath = os.path.join(work_dir, os.fspath(jfile))
dxf_path = os.path.join(work_dir, os.fspath(dxf_file))
if not os.path.exists(jpath):
print("file %s does not exit", jpath)
exit()
if not os.path.exists(dxf_path):
print("file %s does not exit", dxf_path)
exit()
basename = os.path.splitext(dxf_path)[0]
timestamp = datetime.now().strftime(basename+"_%Y%m%d-%H%M%S.dxf")
out_path = os.path.join(work_dir, timestamp)
# erzeuge eine neue dxf Datei mit aktuellen Zeitstempel im Namen
res_pos = new_dxf(jpath, dxf_path, out_path)
else: else:
parser.print_help() parser.print_help()
+29
View File
@@ -0,0 +1,29 @@
{
"kabel": [
{
"id": "BG3241-UC0101",
"coords": [
{ "x": 45, "y": 1235 }, { "x": 40, "y": 4000 } ]
} ,
{
"id": "BG3240-UC0101",
"coords": [
{ "x": 4950,"y": 5595 },{ "x": 4946,"y": 5595 },{ "x": 4946,"y": 3879 },{ "x": 40,"y": 3879 },{ "x": 40,"y": 4000 }
]
},
{
"id": "FC0062-UC0101",
"coords": [
{ "x": 4975,"y": 8068 },{ "x": 4946,"y": 8068 },{ "x": 4946,"y": 3879 },{ "x": 40,"y": 3879 },{ "x": 40,"y": 4000 }
]
},
{
"id": "MA0062-UC0101",
"coords": [
{ "x": 4975,"y": 8068 },{ "x": 4946,"y": 8068 },{ "x": 4946,"y": 3879 },{ "x": 40,"y": 3879 },{ "x": 40,"y": 4000 }
]
}
]
}