前言

暑假找了份测绘员的工作,工作内容就是先外业去测量各个小区楼房,然后内业用cad画立面图。原先在学校实习需要3天才能画完的立面图,工作第一天花4个小时画完,等到第10天的时候时间缩短至2小时。但是带我的老哥只需要40分钟。为了减少自己工作量,打算用python帮个忙,帮我把重复的画图工作做了,现在已经可以1个小时左右画完一栋楼的立面图。

一栋楼需要画东南西北视图+分层图+屋顶平面图

成品

https://github.com/kakasearch/semi-automatic-cad/tree/master/%E6%89%93%E5%8C%85

    代码偏长,直接放成品。实现了批量画偏移线、窗户、阳台、单元门,也可以读入配置文件把各个实体画完。里面最好玩的就是实现了批量偏移线,可以间隔任意长度,不需要多次输入,实用且好用

需求

每个楼要花的东西都是相同的图例,但是大小、位置都不完全相同,所以希望程序能操纵cad画图,而不是直接生成一个文件;其次,只需要把楼的主体框架和各种零部件画出来,然后由我来决定怎样组装成一个整体;最后,我希望有一个配置文件,每次简单改一改配置文件就可适应新的小区。

思路

  1. pyautocad绘制实体

  2. pyqt5做GUI

01

cad绘图功能

用到的cad基本功能有4个,画直线、画多段线、文本注释、图层设置,难度不大,好玩性一般

import sysimport cadtoolfrom pyautocad import Autocad,APoint,aDoublefrom re import findallfrom json import loadsfrom PyQt5.QtWidgets import (QMainWindow, QTextEdit,                             QAction, QFileDialog, QApplication)from PyQt5.QtGui import QIconclass cad:    def __init__(self,ui):        self.acad = Autocad(create_if_not_exists=True)        self.ui = ui    def info(self,str_):        #信息提示        self.acad.prompt(str_)        self.ui.label.setText(str_+"\n"+'\n'.join(self.ui.label.toPlainText().split('\n')[:20]))    def new_layer(self,name,attr=''):                #设置图层        #输入要改变的图元,目标图层名字,传attr新建图层样式,attr为字典        #attr ={'color':1,                # 'linetype':'ACAD_ISO08W100',                # 'lineweight':0.13                # }                layer = self.acad.ActiveDocument.Layers.Add(name)                        #如果有参数,就改,会覆盖        pro = [i for i in attr]                if 'color' in pro and attr['color']:            try:                layer.color = attr['color']                 # ClrNum为颜色索引号,其取值范围为[0,256];                 # 标准颜色的颜色索引号指定如下::1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑;                 # 0 ByBlock、256 ByLayer;                 # 其他颜色索引号见 https://wenku.baidu.com/view/9d458b70195f312b3069a505.html。            except:                 self.info('error!!!!!!!!!颜色设置失败,请自行设置')        if 'linetype' in pro and attr['linetype']:            try:#设置线型                self.acad.ActiveDocument.Linetypes.Load(attr['Linetype'],"acadiso.lin")                # 加载线型,"ACAD_ISO05W100"为线型名称,详细信息见CAD帮助文档;                # "acadiso.lin"为用于公制单位的线型定义文件,详细信息见CAD帮助文档;                # 为图层指定线型前,需先加载相关线型;                # 注意:不能重复加载,否则报错——'记录名重复'                layer.Linetype = attr['Linetype']            except:                layer.Linetype = attr['Linetype']        if 'lineweight' in pro and attr['lineweight']:            try:#设置线型宽                layer.Lineweight = attr['Lineweight']*100                # 13表示线宽为0.01mm的13倍,即0.13mm;                # 线宽值∈{0,5,9,13,15,18,20,25,30,35,40,50,53,60,70,80,90,100,106,120,140,158,200,211};                # 线宽值在上述集合中选取,含义为0.01mm的整数倍;其他数值非系统默认;                # 可以修改现有线宽,但不能添加或删除线宽,修改在CAD程序中进行。            except:                self.info('error!!!!!!!!!线宽设置错误,检查cad是否有次线宽,或自行设置')        return layer    def set_layer(self,from_object,target,attr={}):        layers_names = [self.acad.ActiveDocument.Layers.Item(i).Name for i in range(self.acad.ActiveDocument.Layers.count)]        # 当前文件模型空间中所包含的所有图层名称                if(target not in layers_names):            #没有这个图层,新建一个            self.new_layer(target,attr)          from_object.layer = target            def cad_o(self,h_offset,v_offset,space=50,start=[0,0],config=''):        #cad o命令        #输入偏移数组,输出偏移线        #['1','2','3'] or ['0']        #水平偏移数组,垂直偏移        #min_left #记录图形最下角位置y,防止重叠        p2 = APoint(0,0)        if ['0'] != h_offset: #画水平偏移线            offset_data_arrary = []            for i in range(len(h_offset)):                offset_data_arrary.append(float(h_offset[i]))            offset_length = max(offset_data_arrary)*3 #线的长度            p1 =  APoint(start[0],start[1]+self.min_left)#起始点            p1_ = APoint(start[0],start[1]+self.min_left)#起始点            p2 = APoint(0, self.min_left+start[1]-offset_length)#终点            self.min_left =p2.y - space #间隔50,便于下次画          ###################min_left = p2.y -50 #间隔50,便于下次画             objs = []            #向下画线            objs.append(self.acad.model.AddLine(p1, p2))            for offset in offset_data_arrary:#右侧偏移                p1.x += offset                p2.x += offset                objs.append(self.acad.model.AddLine(p1, p2))            print(p1_,p1,p2)            objs.append(self.acad.model.AddLine(APoint(p1_.x,p2.y), p2)) #下边连接            if config:                target_layer = config['layer']                for obj in objs:                  self.set_layer(obj,target_layer['name'],target_layer)            self.info('水平偏移'+str(offset_data_arrary))        if ['0'] != v_offset: #画竖直偏移线            offset_data_arrary = []            for i in range(len(v_offset)):                offset_data_arrary.append(float(v_offset[i]))            if p2.y:                offset_length =p2.y #线的长度                p1 = APoint(0, p2.y)#起始点            else:                self.min_left -= space #间隔50,便于下次画                 offset_length = max(offset_data_arrary)*3                p1 =APoint(0,min_left)                p2 = APoint(offset_length,min_left)            #向右画线            objs = []            objs.append(self.acad.model.AddLine(p1, p2))            for offset in offset_data_arrary:#上侧偏移                p1.y += offset                p2.y += offset                objs.append(self.acad.model.AddLine(p1, p2))            if config:                target_layer = config['layer']                for obj in objs:                  self.set_layer(obj,target_layer['name'],target_layer)            self.info('垂直偏移'+str(offset_data_arrary))    def cad_pl(self,arr):           #输入坐标数组 [(1,2),(2,3)] or [apoint(1,2),apoint(1,3)] or[1,2,0,1,3,0]    #画线,返回pl对象        try:            if len(arr[0]) == 2:                #[(1,2),(2,3)]                tmp = []                for item in arr:                    tmp.append((item[0],item[1],0))                pnts = [j for i in tmp for j in i]  # 将各点坐标顺序变换为1行多列的1维数组。                            elif len(arr[0]) ==3:                #[apoint(1,2),apoint(1,3)]                pnts = [j for i in arr for j in i]             else:                self.info('cad_pl error!!')                return          except:            #[1,2,0,1,3,0]            pnts = arr        pnts = aDouble(pnts)        return self.acad.model.AddPolyLine(pnts)            def offset(self,config=''):        #可以批量偏移的偏移命令        ###数据获取        if(config):            target_layer = config['layer']            datas = config['data']            space = config['space']            start = config['start']            datas=config['data']        else:            space = 800            start = [0,0]#窗户起始右下标            target_layer = ''            datas= self.ui.text.toPlainText().replace(',',',').split('\n')        if not datas:            self.info('需要先输入数据')            return        self.min_left = 0 #左下角位置        #数据处理成固定格式,123 123        #self.info('读取数据 '+str(datas))                for i in range(len(datas)):            #'2,3,4 4,3,2' or '1,2,3,4'            if '#' in datas[i]:                offset = datas[i].split('#')            elif '\t' in datas[i]:                offset = datas[i].split('\t')            elif ' ' in datas[i]:                offset = datas[i].split(' ')            else:                offset = [datas[i],'0']            ##['1,2,3','3,2,1'] or ['1,2,3','0']            h_offset = findall(r'\d+[\.]?\d*',offset[0])#取出所有数字            v_offset = findall(r'\d+[\.]?\d*',offset[1])#取出所有数字            #画偏移            obj = self.cad_o(h_offset,v_offset,space=space,start=start,config=config)    def window(self,config=''):         #窗户向左画        if(config):            space = config['space']            start = config['start']#窗户起始右下标            target_layer = config['layer']            datas = config['data']        else:            space = 800            start = [0,0]#窗户起始右下标            target_layer = ''            datas= self.ui.text.toPlainText().replace(',',',')        if datas:            hvs = findall(r'\d+[\.]?\d*',datas)#取出所有数字        else:            self.info('请输入数据')            return        #self.info(list(range(len(hvs))[::2]))        for i in range(len(hvs))[::2]:            h = float(hvs[i])            v = float(hvs[i+1])            self.acad.model.AddText('{}x{}'.format(hvs[i],hvs[i+1]), APoint(start[0]-h,start[1]-700), 300)            self.info('窗口绘制:{},{}'.format(hvs[i],hvs[i+1]))            x,y = start[0],start[1]            pnts = [(x,y),(x-h,y),(x-h,y+v),(x,y+v),(x,y),(x,y+v/2),(x-h,y+v/2),(x-h/2,y+v/2),(x-h/2,y+v),(x-h/2,y)]            obj = self.cad_pl(pnts)            if target_layer:                self.set_layer(obj,target_layer['name'],target_layer)            start =(start[0]-space-h,start[1])            #pnts.append(-h,min_right 0,min_right 0,-v+min_right -h,-v+min_right -h,min_right -h/2,min_right -h/2,-v+min_right -h/2,-v/2+min_right, -h,-v/2+min_right 0,-v/2+min_right)    def balcony(self,config=''):        if(config):            space = config['space']            start = config['start']#窗户起始右下标            target_layer = config['layer']            datas = config['data']        else:            space = 800            start = [0,0]#窗户起始右下标            target_layer = ''            datas= self.ui.text.toPlainText().replace(',',',')        if datas:            hvs = findall(r'\d+[\.]?\d*',datas)#取出所有数字        else:            self.info('请输入数据')            return        #self.info(list(range(len(hvs))[::2]))        for i in range(len(hvs))[::2]:            h = float(hvs[i])            v = float(hvs[i+1])            self.acad.model.AddText('{}x{}'.format(hvs[i],hvs[i+1]), APoint(start[0],start[1]-700), 300)            self.info('阳台绘制:{},{}'.format(hvs[i],hvs[i+1]))            num = 0            x,y = start#起点元祖            while h/(2**num)>2000:                num+=1            min_h = h/(2**num)            pnts = []            for i in range(2**num):                #一组                temp_pnts = [(x,y),(x+min_h,y),(x+min_h,y+v),(x,y+v),(x,y),(x,y+v*2/3),(x+min_h,y+v*2/3),(x+min_h/2,y+v*2/3),(x+min_h/2,y),(x+min_h,y)]                pnts+= temp_pnts                x+=min_h#下一个            obj = self.cad_pl(pnts)            if target_layer:                self.set_layer(obj,target_layer['name'],target_layer)            start =(start[0]+h+space,start[1])    def door(self,config=''):        #door 向左下画        if(config):            space = config['space']            start = config['start']#窗户起始右下标            target_layer = config['layer']            datas = config['data']        else:            space = 800            start = [0,0]#窗户起始右下标            target_layer = ''            datas = self.ui.text.toPlainText().replace(',',',')        if datas:            hvs = findall(r'\d+[\.]?\d*',datas)#取出所有数字        else:            self.info('请输入数据')            return        #self.info(list(range(len(hvs))[::2]))        for i in range(len(hvs))[::2]:            h = float(hvs[i])            v = float(hvs[i+1])            self.acad.model.AddText('{}x{}'.format(hvs[i],hvs[i+1]), APoint(start[0]-h,start[1]-v-700), 300)            self.info('门绘制:{},{}'.format(hvs[i],hvs[i+1]))            x,y = start#起点元祖            pnts = [(x,y),(x-h,y),(x-h,y-v),(x,y-v),(x,y)]            outer = self.cad_pl(pnts)#框            if config:                self.set_layer(outer,target_layer['name'],target_layer)            pnts = [(x,y),(x-0.82*h,y-0.1*v),(x-h,y-v)]            inner = self.cad_pl(pnts)#里面黄线            inner.color = 2            # 标准颜色的颜色索引号指定如下::1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑;            start =(start[0]-space-h,start[1])    def draw_from_config(self,path='config.json'):       #self.info(path)        #self.info(data)        data =  self.ui.text.toPlainText()        if data:            try:                data = loads(data)                self.info('正在读取 '+data['name'])            except:                self.info('配置解析失败,请检查是否为json格式')                return                else:            self.info('请先输入数据')            return        for key in ['offset','window','balcony','door']:            if tmp := data.get(key):                if tmp.get('name'):                    self.info('\n\n*****开始绘制:'+tmp['name'])                eval("self.%s(tmp)"%key)        self.info('\n\n================================')def showDialog(ui):    ui.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)      # 弹出文件选择框。第一个字符串参数是getOpenFileName()方法的标题。第二个字符串参数指定了对话框的工作目录。    # 默认的,文件过滤器设置成All files (*)。    fname = QFileDialog.getOpenFileName(None, 'Open file', './config.json','*;;*.json;;*.txt')    # 选中文件后,读出文件的内容,并设置成文本编辑框组件的显示文本    if fname[0]:        f = open(fname[0], 'r',encoding='utf-8')        with f:            data = f.read()            ui.text.setPlainText(data)if __name__ == '__main__':    try:        app = QApplication(sys.argv)        MainWindow = QMainWindow()        ui = cadtool.Ui_cad_tool()        ui.setupUi(MainWindow)                MainWindow.show()        cad = cad(ui)        ui.window_btn.clicked.connect(lambda :cad.window())        ui.door_btn.clicked.connect(lambda :cad.door())        ui.offset_btn.clicked.connect(lambda :cad.offset())        ui.balcony_btn.clicked.connect(lambda :cad.balcony())        ui.config_btn.clicked.connect(lambda :cad.draw_from_config())        ui.actionopen_2.triggered.connect(lambda :showDialog(ui))        ui.actionexit_2.triggered.connect(lambda :exit())        #ui.plainTextEdit_5.setPlainText("...")        sys.exit(app.exec_())    except Exception as e:        cad.info(str(e))

02

pyqt5

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'cadtool.ui'## Created by: PyQt5 UI code generator 5.15.0## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import (QMainWindow, QTextEdit,                             QAction, QFileDialog, QApplication)from PyQt5.QtGui import QIconclass Ui_cad_tool(object):    def setupUi(self, cad_tool):        cad_tool.setObjectName("cad_tool")        cad_tool.resize(432, 346)        cad_tool.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)        icon = QtGui.QIcon()        icon.addPixmap(QtGui.QPixmap("cad.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)        cad_tool.setWindowIcon(icon)        self.centralwidget = QtWidgets.QWidget(cad_tool)        self.centralwidget.setObjectName("centralwidget")        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)        self.gridLayout.setObjectName("gridLayout")        self.verticalLayout = QtWidgets.QVBoxLayout()        self.verticalLayout.setObjectName("verticalLayout")        self.offset_btn = QtWidgets.QPushButton(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.offset_btn.sizePolicy().hasHeightForWidth())        self.offset_btn.setSizePolicy(sizePolicy)        self.offset_btn.setMaximumSize(QtCore.QSize(16777215, 16777215))        self.offset_btn.setBaseSize(QtCore.QSize(0, 30))        self.offset_btn.setIconSize(QtCore.QSize(16, 30))        self.offset_btn.setObjectName("offset_btn")        self.verticalLayout.addWidget(self.offset_btn)        self.window_btn = QtWidgets.QPushButton(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.window_btn.sizePolicy().hasHeightForWidth())        self.window_btn.setSizePolicy(sizePolicy)        self.window_btn.setObjectName("window_btn")        self.verticalLayout.addWidget(self.window_btn)        self.balcony_btn = QtWidgets.QPushButton(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.balcony_btn.sizePolicy().hasHeightForWidth())        self.balcony_btn.setSizePolicy(sizePolicy)        self.balcony_btn.setObjectName("balcony_btn")        self.verticalLayout.addWidget(self.balcony_btn)        self.door_btn = QtWidgets.QPushButton(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.door_btn.sizePolicy().hasHeightForWidth())        self.door_btn.setSizePolicy(sizePolicy)        self.door_btn.setObjectName("door_btn")        self.verticalLayout.addWidget(self.door_btn)        self.gridLayout.addLayout(self.verticalLayout, 1, 1, 1, 1)        self.verticalLayout_3 = QtWidgets.QVBoxLayout()        self.verticalLayout_3.setObjectName("verticalLayout_3")        self.text = QtWidgets.QPlainTextEdit(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.text.sizePolicy().hasHeightForWidth())        self.text.setSizePolicy(sizePolicy)        self.text.setPlaceholderText("请在此输入。。。")        self.text.setObjectName("text")        self.verticalLayout_3.addWidget(self.text)        self.config_btn = QtWidgets.QPushButton(self.centralwidget)        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)        sizePolicy.setHorizontalStretch(0)        sizePolicy.setVerticalStretch(0)        sizePolicy.setHeightForWidth(self.config_btn.sizePolicy().hasHeightForWidth())        self.config_btn.setSizePolicy(sizePolicy)        self.config_btn.setObjectName("config_btn")        self.verticalLayout_3.addWidget(self.config_btn)        self.gridLayout.addLayout(self.verticalLayout_3, 1, 0, 1, 1)        self.label = QtWidgets.QTextBrowser(self.centralwidget)        self.label.setObjectName("label")        self.gridLayout.addWidget(self.label, 0, 0, 1, 2)        cad_tool.setCentralWidget(self.centralwidget)        self.menubar = QtWidgets.QMenuBar(cad_tool)        self.menubar.setGeometry(QtCore.QRect(0, 0, 432, 22))        self.menubar.setObjectName("menubar")        self.menuopen = QtWidgets.QMenu(self.menubar)        self.menuopen.setObjectName("menuopen")        cad_tool.setMenuBar(self.menubar)        self.statusbar = QtWidgets.QStatusBar(cad_tool)        self.statusbar.setObjectName("statusbar")        cad_tool.setStatusBar(self.statusbar)        self.actionexit = QtWidgets.QAction(cad_tool)        self.actionexit.setObjectName("actionexit")        self.actionopen = QtWidgets.QAction(cad_tool)        self.actionopen.setObjectName("actionopen")        self.actionabout_us = QtWidgets.QAction(cad_tool)        self.actionabout_us.setObjectName("actionabout_us")        self.actionopen_2 = QtWidgets.QAction(cad_tool)        self.actionopen_2.setObjectName("actionopen_2")        self.actionexit_2 = QtWidgets.QAction(cad_tool)        self.actionexit_2.setObjectName("actionexit_2")        self.menuopen.addAction(self.actionopen_2)        self.menuopen.addAction(self.actionexit_2)        self.menubar.addAction(self.menuopen.menuAction())        self.retranslateUi(cad_tool)        QtCore.QMetaObject.connectSlotsByName(cad_tool)    def retranslateUi(self, cad_tool):        _translate = QtCore.QCoreApplication.translate        cad_tool.setWindowTitle(_translate("cad_tool", "cad_tool"))        self.offset_btn.setText(_translate("cad_tool", "批量偏移"))        self.window_btn.setText(_translate("cad_tool", "窗户"))        self.balcony_btn.setText(_translate("cad_tool", "阳台"))        self.door_btn.setText(_translate("cad_tool", "单元门"))        self.config_btn.setText(_translate("cad_tool", "读取配置"))        self.label.setPlaceholderText(_translate("cad_tool", "消息区"))        self.menuopen.setTitle(_translate("cad_tool", "file"))        self.actionexit.setText(_translate("cad_tool", "exit"))        self.actionopen.setText(_translate("cad_tool", "open"))        self.actionabout_us.setText(_translate("cad_tool", "about us"))        self.actionopen_2.setText(_translate("cad_tool", "open"))        self.actionopen_2.setStatusTip(_translate("cad_tool", "open config", "open"))        self.actionopen_2.setShortcut(_translate("cad_tool", "Ctrl+O"))        self.actionexit_2.setText(_translate("cad_tool", "exit"))        self.actionexit_2.setStatusTip(_translate("cad_tool", "exit "))        self.actionexit_2.setShortcut(_translate("cad_tool", "Esc"))

最后用pyinstaller 打包即可

cad二次开发加载cad自动调用_python实例_cad半自动绘图相关推荐

  1. CAD二次开发加载自定义模块程序流程

    (1)启动CAD: acad.exe 脚本1 脚本1中通常包含命令内容和顺序 (1)使用CAD自身命令初始化: 初始化CAD的窗口内容和风格,如但文档试图:初始化缩放比例等等: (2)arxload ...

  2. Revit二次开发加载RevitLookup.dll程序集

    Revit二次开发加载RevitLookup.dll程序集 Revit二次开发环境搭建(Revit 2019+Visual Studio 2017) 更正加载RevitLookup.dll: 编译出R ...

  3. cad二次开发 java_关于CAD二次开发,你究竟知道多少?

    原标题:关于CAD二次开发,你究竟知道多少? 一.CAD二次开发,应用广泛,机械工程类比较明显! 二.开发语言:Lisp: Autodesk Lisp ObjectARX: VC++ ActiveX: ...

  4. CAD二次开发不关闭CAD进行编译调试代码片段

    代码 [CommandMethod("NLX")] //设计的新命令public void NLX() //调用HelloWorld 命令要调用的函数{string filepat ...

  5. UG二次开发加载dll,ufusr出错,Failed to load image

    使用VC6.0和VS2010做UG的二次开发,生成的dll在本地电脑上运行没有任何问题,复制到另外一台电脑上运行出现了错误,无法加载图像,ufusr报错.排除UG版本问题,排除32位/64位操作系统问 ...

  6. C#实战之CAD二次开发001:CAD和C#的环境配置

    前言 本博文主要介绍利用C#对CAD进行二次开发,结合了ObjectARX功能强大的特点和VBA易用的特点,通过实战项目对C#开发CAD进行一个简要的介绍. 1.CAD的安裝 首先我们需要安装CAD, ...

  7. Rhino二次开发 加载插件的同时加载按钮

    打开Rhino,使用Rhino的工具栏命令:ToolBar,新建一个rui文件 在新建的文件里新增所需要的工具列 然后新增按钮. 文件保存在插件的rhp文件所在的同级目录下,这样加载插件时就会自动加载 ...

  8. 【CAD二次开发】添加cad支持文件夹

    我们有时候自己的模板需要用到指定的字体,我们可以把字体放到插件的安装目录里,通过添加支持路径的方式来实现添加CAD字体. //添加自定义字体搜索目录string filePath = Assembly ...

  9. cad二次开发——自动运行dll,加载菜单(收集)

    1.自动加载dll的方法(个人觉得下面第4个方法会更方便) cad加载dll_实现CAD插件启动自动加载的三种方法_weixin_39774556的博客-CSDN博客从网上或者别处淘来的CAD插件,效 ...

最新文章

  1. l360废墨收集垫更换视频_更新原厂隔音垫你选对材料了吗?
  2. 近两年跟踪速度较快的算法小结
  3. c#学习路线应该靠谱
  4. c语言创建新指针,如何用c语言创建一个指针
  5. Jquery屏蔽回车键
  6. tmux + zsh
  7. Read Excel
  8. 基于Debian的Linux发行版安装深度音乐及其插件,支持ubunut16
  9. Selenium实战应用——实现知到智慧树自动播放课程
  10. DeskPins-让应用始终在最前面
  11. 刚体运动学公式_刚体的运动学与动力学问题 (二)
  12. PeopleSoft基础知识整理
  13. 2022年第十三届蓝桥杯大赛软件类决赛C/C++/Java/Python真题
  14. linux篇【12】:网络套接字<前序>—网络基础+udp套接字
  15. 盘点2018程序员才懂的100个段子/搞笑图(上篇)
  16. CircuitJS 好玩实用电路仿真软件
  17. The last packet successfully received from the server was 1,072 milliseconds ago. The last packet s
  18. 定期定量采购_定量、定期订货法的比较
  19. 微信域名解封-防封系统 怎么样才能让被微信屏蔽的网址允许访问
  20. 聊聊APP数据分析的那些思路

热门文章

  1. python输入文字字符串、如何提取字符_如何使用python从字符串中提取url?
  2. antd table动态表头_antd table动态控制指定列的显隐
  3. 【转】理清基本的git(github)流程
  4. C#之数据库编程:从入门到精通
  5. 使用CName记录的好处(转)
  6. ZOJ 2527题解
  7. 关于IIS不能浏览ASP网页 和不能浏览后台(转)
  8. 小程序 自适应rpx
  9. mysql 5.5 双机热备_mysql 5.5双机热备份 master-master
  10. ttf文件 python 打开_[译]JS解析TTF字体文件