def optimum_rotate(filename, seplayer=False): print("file : " + filename) org_dxf = ezdxf.readfile(filename) n = 1 if seplayer: nl = 'L' + chr(ord('A') + n) np = 'P' + chr(ord('A') + n) rename_layer(org_dxf, '0', nl) rename_layer(org_dxf, 'Defpoints', np) hmin = 999999999 bestdxf = None bestang = None for ang in range(0, 360, 1): rdxf = ezdxf.readfile(filename) rotate(rdxf, ang) s = bbox.extends(rdxf.modelspace()).size h = s[1] if (h < hmin) and (hmin - h > 1E-5): hmin = h bestang = ang bestdxf = rdxf #print(" angle=",ang, " h=", h) #print(" s : ", s) #print(" s0 : ", bbox.extends(org_dxf.modelspace()).size) if bestdxf is None: print("no rotation") return org_dxf print("rotation ", bestang) return bestdxf
def merge_dxfs(listname, seplayer=False, shifth=0, shiftv=0): n = -1 tx = 10 ty = 0 for filename in listname: n = n + 1 merge_dxf = ezdxf.readfile(filename) print("file : " + filename) #print("header : ", merge_dxf.header) #print("EXTMAX ", merge_dxf.header['$EXTMAX']) #print("EXTMIN ", merge_dxf.header['$EXTMIN']) #print("LIMMAX ", merge_dxf.header['$LIMMAX']) #print("LIMMIN ", merge_dxf.header['$LIMMIN']) if seplayer: nl = 'L' + chr(ord('A') + n) np = 'P' + chr(ord('A') + n) rename_layer(merge_dxf, '0', nl) rename_layer(merge_dxf, 'Defpoints', np) if shifth > 0 or shiftv > 0: msp = merge_dxf.modelspace() cache = bbox.Cache() bounds = bbox.extends(msp, cache) minpt = bounds.extmin s = bounds.size print("bbox : ", bounds) print(" min : ", minpt) print(" s : ", s) dx = tx - minpt[0] dy = ty - minpt[1] print("dx = ", dx, " dy = ", dy) #translation_x_y(merge_dxf, n*500, n*100) translation_x_y(merge_dxf, dx, dy) if shifth > 0: tx = tx + s[0] + shifth if shiftv > 0: ty = ty + s[1] + shiftv if n > 0: merge(merge_dxf, base_dxf) else: base_dxf = merge_dxf return base_dxf
print("no rotation") return org_dxf print("rotation ", bestang) return bestdxf if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( 'dxf_file', metavar='dxf_file', type=str, #nargs=1, help='dxf file to process') parser.add_argument("--layers", help="one layer per input file", action="store_true") args = parser.parse_args() print("file: ", args.dxf_file) fn = args.dxf_file fbn = basename(fn) fxn = os.path.splitext(fbn)[0] fout = fxn + '_opt.dxf' d = optimum_rotate(args.dxf_file, args.layers) print("save to : ", fout) msp = d.modelspace() s = bbox.extends(msp).size print("final size: ", s) d.saveas(fout)
def test_cache_usage_with_uuids(points1): # Entities in VirtualLayouts have no handles: cache = bbox.Cache(uuid=True) for _ in range(10): bbox.extends(points1, cache) assert cache.hits == 18
def test_extend(points1): box = bbox.extends(points1) assert box.extmin == (-1, -2, -3) assert box.extmax == (4, 5, 6)