def set_arrows(self, blk: str = '', blk1: str = '', blk2: str = '', ldrblk: str = '') -> None: """ Set arrows by block names or AutoCAD standard arrow names, set DIMTSZ to ``0`` which disables tick. Args: blk: block/arrow name for both arrows, if DIMSAH is ``0`` blk1: block/arrow name for first arrow, if DIMSAH is ``1`` blk2: block/arrow name for second arrow, if DIMSAH is ``1`` ldrblk: block/arrow name for leader """ self.set_dxf_attrib('dimblk', blk) self.set_dxf_attrib('dimblk1', blk1) self.set_dxf_attrib('dimblk2', blk2) self.set_dxf_attrib('dimldrblk', ldrblk) self.set_dxf_attrib('dimtsz', 0) # use blocks # only existing BLOCK definitions allowed if self.doc: blocks = self.doc.blocks for b in (blk, blk1, blk2, ldrblk): if ARROWS.is_acad_arrow(b): # not real blocks ARROWS.create_block(blocks, b) continue if b and b not in blocks: raise DXFValueError( 'BLOCK "{}" does not exist.'.format(blk))
def acquire_arrow(self, name: str): """ For standard AutoCAD and ezdxf arrows create block definitions if required, otherwise check if block `name` exist. (internal API) """ from ezdxf.render.arrows import ARROWS if ARROWS.is_acad_arrow(name) or ARROWS.is_ezdxf_arrow(name): ARROWS.create_block(self.blocks, name) elif name not in self.blocks: raise const.DXFValueError(f'Arrow block "{name}" does not exist.')
def create_all_arrow_blocks(self): """ For upgrading DXF R12/13/14 files to R2000, it is necessary to create all used arrow blocks before saving the DXF file, else $HANDSEED is not the next available handle, which is a problem for AutoCAD. To be save create all known AutoCAD arrows, because references to arrow blocks can be in DIMSTYLE, DIMENSION override, LEADER override and maybe other places. """ from ezdxf.render.arrows import ARROWS for arrow_name in ARROWS.__acad__: ARROWS.create_block(self.blocks, arrow_name)
def set_arrow_handle(attrib_name, block_name): attrib_name += '_handle' if block_name in ARROWS: # create all arrows on demand block_name = ARROWS.create_block(blocks, block_name) if block_name == '_CLOSEDFILLED': # special arrow handle = '0' # set special #0 handle for closed filled arrow else: block = blocks[block_name] handle = block.block_record_handle data[attrib_name] = handle
def _set_blk_handle(self, attr: str, arrow_name: str) -> None: if arrow_name == ARROWS.closed_filled: # special arrow, no handle needed (is '0' if set) # do not create block by default, this will be done if arrow is used # and block record handle is not needed here self.del_dxf_attrib(attr) return blocks = self.drawing.blocks if ARROWS.is_acad_arrow(arrow_name): # create block, because need block record handle is needed here block_name = ARROWS.create_block(blocks, arrow_name) else: block_name = arrow_name blk = blocks.get(block_name) self.set_dxf_attrib(attr, blk.block_record_handle)
def set_blk_handle(self, attr: str, arrow_name: str) -> None: if arrow_name == ARROWS.closed_filled: # special arrow, no handle needed (is '0' if set) # do not create block by default, this will be done if arrow is used # and block record handle is not needed here self.dxf.discard(attr) return blocks = self.doc.blocks if ARROWS.is_acad_arrow(arrow_name): # create block, because need block record handle is needed here block_name = ARROWS.create_block(blocks, arrow_name) else: block_name = arrow_name blk = blocks.get(block_name) if blk is not None: self.set_dxf_attrib(attr, blk.block_record_handle) else: raise DXFValueError(f'Block {arrow_name} does not exist.')
def test_closed_arrow_doc_r2000(): doc = ezdxf.new(dxfversion="R2000", setup=True) blocks = doc.blocks name = ARROWS.create_block(blocks, ARROWS.closed) arrow_entities = list(blocks.get(name)) assert arrow_entities[0].dxftype() == "LWPOLYLINE"
def test_closed_arrow_r2000(dxf2000): blocks = dxf2000.blocks name = ARROWS.create_block(blocks, ARROWS.closed) arrow_entities = list(blocks.get(name)) assert arrow_entities[0].dxftype() == 'LWPOLYLINE'