cad二次开发加载cad自动调用_python实例_cad半自动绘图
前言
暑假找了份测绘员的工作,工作内容就是先外业去测量各个小区楼房,然后内业用cad画立面图。原先在学校实习需要3天才能画完的立面图,工作第一天花4个小时画完,等到第10天的时候时间缩短至2小时。但是带我的老哥只需要40分钟。为了减少自己工作量,打算用python帮个忙,帮我把重复的画图工作做了,现在已经可以1个小时左右画完一栋楼的立面图。
一栋楼需要画东南西北视图+分层图+屋顶平面图
成品
https://github.com/kakasearch/semi-automatic-cad/tree/master/%E6%89%93%E5%8C%85
代码偏长,直接放成品。实现了批量画偏移线、窗户、阳台、单元门,也可以读入配置文件把各个实体画完。里面最好玩的就是实现了批量偏移线,可以间隔任意长度,不需要多次输入,实用且好用
需求
每个楼要花的东西都是相同的图例,但是大小、位置都不完全相同,所以希望程序能操纵cad画图,而不是直接生成一个文件;其次,只需要把楼的主体框架和各种零部件画出来,然后由我来决定怎样组装成一个整体;最后,我希望有一个配置文件,每次简单改一改配置文件就可适应新的小区。
思路
pyautocad绘制实体
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半自动绘图相关推荐
- CAD二次开发加载自定义模块程序流程
(1)启动CAD: acad.exe 脚本1 脚本1中通常包含命令内容和顺序 (1)使用CAD自身命令初始化: 初始化CAD的窗口内容和风格,如但文档试图:初始化缩放比例等等: (2)arxload ...
- Revit二次开发加载RevitLookup.dll程序集
Revit二次开发加载RevitLookup.dll程序集 Revit二次开发环境搭建(Revit 2019+Visual Studio 2017) 更正加载RevitLookup.dll: 编译出R ...
- cad二次开发 java_关于CAD二次开发,你究竟知道多少?
原标题:关于CAD二次开发,你究竟知道多少? 一.CAD二次开发,应用广泛,机械工程类比较明显! 二.开发语言:Lisp: Autodesk Lisp ObjectARX: VC++ ActiveX: ...
- CAD二次开发不关闭CAD进行编译调试代码片段
代码 [CommandMethod("NLX")] //设计的新命令public void NLX() //调用HelloWorld 命令要调用的函数{string filepat ...
- UG二次开发加载dll,ufusr出错,Failed to load image
使用VC6.0和VS2010做UG的二次开发,生成的dll在本地电脑上运行没有任何问题,复制到另外一台电脑上运行出现了错误,无法加载图像,ufusr报错.排除UG版本问题,排除32位/64位操作系统问 ...
- C#实战之CAD二次开发001:CAD和C#的环境配置
前言 本博文主要介绍利用C#对CAD进行二次开发,结合了ObjectARX功能强大的特点和VBA易用的特点,通过实战项目对C#开发CAD进行一个简要的介绍. 1.CAD的安裝 首先我们需要安装CAD, ...
- Rhino二次开发 加载插件的同时加载按钮
打开Rhino,使用Rhino的工具栏命令:ToolBar,新建一个rui文件 在新建的文件里新增所需要的工具列 然后新增按钮. 文件保存在插件的rhp文件所在的同级目录下,这样加载插件时就会自动加载 ...
- 【CAD二次开发】添加cad支持文件夹
我们有时候自己的模板需要用到指定的字体,我们可以把字体放到插件的安装目录里,通过添加支持路径的方式来实现添加CAD字体. //添加自定义字体搜索目录string filePath = Assembly ...
- cad二次开发——自动运行dll,加载菜单(收集)
1.自动加载dll的方法(个人觉得下面第4个方法会更方便) cad加载dll_实现CAD插件启动自动加载的三种方法_weixin_39774556的博客-CSDN博客从网上或者别处淘来的CAD插件,效 ...
最新文章
- l360废墨收集垫更换视频_更新原厂隔音垫你选对材料了吗?
- 近两年跟踪速度较快的算法小结
- c#学习路线应该靠谱
- c语言创建新指针,如何用c语言创建一个指针
- Jquery屏蔽回车键
- tmux + zsh
- Read Excel
- 基于Debian的Linux发行版安装深度音乐及其插件,支持ubunut16
- Selenium实战应用——实现知到智慧树自动播放课程
- DeskPins-让应用始终在最前面
- 刚体运动学公式_刚体的运动学与动力学问题 (二)
- PeopleSoft基础知识整理
- 2022年第十三届蓝桥杯大赛软件类决赛C/C++/Java/Python真题
- linux篇【12】:网络套接字<前序>—网络基础+udp套接字
- 盘点2018程序员才懂的100个段子/搞笑图(上篇)
- CircuitJS 好玩实用电路仿真软件
- The last packet successfully received from the server was 1,072 milliseconds ago. The last packet s
- 定期定量采购_定量、定期订货法的比较
- 微信域名解封-防封系统 怎么样才能让被微信屏蔽的网址允许访问
- 聊聊APP数据分析的那些思路
热门文章
- python输入文字字符串、如何提取字符_如何使用python从字符串中提取url?
- antd table动态表头_antd table动态控制指定列的显隐
- 【转】理清基本的git(github)流程
- C#之数据库编程:从入门到精通
- 使用CName记录的好处(转)
- ZOJ 2527题解
- 关于IIS不能浏览ASP网页 和不能浏览后台(转)
- 小程序 自适应rpx
- mysql 5.5 双机热备_mysql 5.5双机热备份 master-master
- ttf文件 python 打开_[译]JS解析TTF字体文件