本文由 资源共享网 – ziyuan 发布,转载请注明出处,如有问题请联系我们!python打印cad图纸 源码
收藏有了python打印cad,从此告别插件!!哈哈哈[mw_shl_code=python,true]
from pyautocad import Autocadimport win32com.client import win32print import pythoncom #acad = Autocad(create_if_not_exists = True) acad = win32com.client.Dispatch("AutoCAD.Application.23") # AutoCAD.Application.23为 ProgID acaddoc = acad.ActiveDocument acadmod = acaddoc.ModelSpace layout = acaddoc.layouts.item('Model') plot = acaddoc.Plot _PRINTER = win32print.GetDefaultPrinter() _HPRINTER = win32print.OpenPrinter(_PRINTER) #_PrinterStatus = 'Warning' def PrinterStyleSetting(): acaddoc.SetVariable('BACKGROUNDPLOT', 0) # 前台打印 layout.ConfigName = 'RICOH MP C2011' # 选择打印机 layout.StyleSheet = 'monochrome.ctb' # 选择打印样式 layout.PlotWithLineweights = False # 不打印线宽 layout.CanonicalMediaName = 'A3' # 图纸大小这里选择A3 layout.PlotRotation = 1 # 横向打印 layout.CenterPlot = True # 居中打印 layout.PlotWithPlotStyles = True # 依照样式打印 layout.PlotHidden = False # 隐藏图纸空间对象 print(layout.GetPlotStyleTableNames()[-1]) layout.PlotType = 4 ''' PlotType (enum类型): acDisplay: 按显示的内容打印. acExtents: 按当前选定空间范围内的所有内容打印. acLimits: 打印当前空间范围内的所有内容. acView: 打印由 ViewToPlot 属性命名的视图. acWindow: 打印由 SetWindowToPlot 方法指定的窗口中的所有内容. ****** acLayout: 打印位于指定纸张尺寸边缘的所有内容,原点从 0,0 坐标计算。 ''' DEFAULT_START_POSITION =(3,3) DRAWING_SIZE = (598,422) DRAWING_INTEND = 700 class BackPrint(object): _instance = None def __new__(cls, *args, **kw): if cls._instance is None: cls._instance = super(BackPrint, cls).__new__(cls) return cls._instance def __init__(self,PositionX,PositionY): self.x = PositionX self.y = PositionY @staticmethod def APoint(x,y): """坐标点转化为浮点数""" # 需要两个点的坐标 return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x,y)) def run(self,Scale = 1.0): #self.PrinterStyleSetting() po1 = self.APoint(self.x * Scale - 1, self.y * Scale) po2 = self.APoint(self.x * Scale - 1 + DRAWING_SIZE[0], self.y * Scale + DRAWING_SIZE[1]) # 左下点和右上点 layout.SetWindowToPlot(po1, po2) PrinterStyleSetting() plot.PlotToDevice() class PrintTask: def __init__(self,maxPrintPositionArray,startPosition=(DEFAULT_START_POSITION[0],DEFAULT_START_POSITION[1])): self._PrinterStatus = 'Waiting' self.maxPrintPositionArray = maxPrintPositionArray # 此处要进行数据验证 self.printBasePointArray = [] self.taskPoint = startPosition self.PrintingTaskNumber = 0 def runtask(self,): if not self.printBasePointArray: self.printBasePointArray = self.generalPrintBasePointArray(self.maxPrintPositionArray) for position in self.printBasePointArray: #printBasePointArray形式 : [(,),(,),] self.taskPoint = position current_task = BackPrint(*position) current_task.run() self.PrintingTaskNumber = len(win32print.EnumJobs(_HPRINTER,0,-1,1)) #print('ing-> ',self.PrintingTaskNumber,'position',position) while self.PrintingTaskNumber >= 5: time.sleep(1) self.PrintingTaskNumber = len(win32print.EnumJobs(_HPRINTER,0,-1,1)) time.sleep(1) def ResumeTask(self,): pass def generalPrintBasePointArray(self,maxPrintPositionArray): printBasePointArray = [] next_drawing_xORy_intend = DRAWING_INTEND current_x = int((self.taskPoint[0] - 4)/ DRAWING_INTEND)*DRAWING_INTEND + DEFAULT_START_POSITION[0] current_y = int((self.taskPoint[1] - 4)/DRAWING_INTEND)*DRAWING_INTEND + DEFAULT_START_POSITION[1] #print(current_x,current_y) for position in maxPrintPositionArray: while current_x <= position + DEFAULT_START_POSITION[0]: printBasePointArray.append((current_x,current_y)) current_x += next_drawing_xORy_intend current_x = DEFAULT_START_POSITION[0] current_y += next_drawing_xORy_intend return printBasePointArray #printBasePointArray形式 : [(,),(,),] def getTaskNumber(self,): TaskNumber = self.PrintingTaskNumber try: TaskNumber = len(win32print.EnumJobs(_HPRINTER,0,-1,1)) return TaskNumber except Exception as e: return TaskNumber if __name__ == '__main__': task = PrintTask([27895,],(6194,4)) task.runtask()
技术文章资源(python打印cad图纸 源码)网址:https://www.08i8.com/course/detail543.html;转载请注明!