热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CAD中用lisp程序实现批量偏移_python实例_cad半自动绘图

前言暑假找了份测绘员的工作,工作内容就是先外业去测量各个小区楼房,然后内业用cad画立面图。原先在学校实习需要3天才能画完的立面图,工作第

前言

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

ed3f42dd7436ef0daf2b1e9cfdf6efb1.png

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

成品

6344edb54e4dc720e33c68ffea437d2f.png

1a46346b6a8a417622b3f9679948d241.png

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 打包即可




推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
author-avatar
Missluckyyy_879
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有