import argparse import ezdxf import random # needed for random placing points from ezdxf.enums import TextEntityAlignment import os.path from dataclasses import dataclass, asdict, fields from dacite import from_dict from typing import List @dataclass class Point: x: float y: float @dataclass class Polyline: id: str punkte: List[Point] 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 create_block(doc): flag = doc.blocks.new(name='FLAG') # Add DXF entities to the block 'FLAG'. # The default base point (= insertion point) of the block is (0, 0). 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 return flag def create_points(msp): # Get 50 random placing points. placing_points = [get_random_point() for _ in range(50)] for point in placing_points: # 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 doc = ezdxf.new('R2018', setup=True) # add new entities to the modelspace msp = doc.modelspace() # # Beispiel für Text und Polyline # add_text(msp) # add_polyline(msp) # Beispiel für Block create_block(doc) create_points(msp) doc.saveas(path) if __name__ == '__main__': 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') args = parser.parse_args() work_dir = os.environ.get('PROJECT_WORK') filename = os.fspath(args.filename) path = os.path.join(work_dir, filename + '_cable.dxf') if args.filename: res_pos = new_dxf(filename) else: parser.print_help()