虽然chatgpt可以帮助我们自动编写一些cad插件,但是由于结果反馈并不总是正确。所以,如果想要自己编写插件,且功能较为简单的。便可以学习一些基本知识。
编程语言最基础的须知,是函数的用法。你想实现什么功能,就去用什么函数。这就像是,你想要做加法,就要用加号一个道理。
想要编写直线上插入块的插件,就要知道cad中什么操作能实现。比较广为熟知的就是divide命令。其操作如下。
这个操作实现主要包括三个部分:1选择直线;2插入块的块名;3插入线段的数量,这个数量与块的数量相差为1。
所以,代码就是要实现以上三个操作,那边可以完成了。根据要求,编写代码如下:
(defun C:cc() ;选择直线,插入指定数量的块 (princ "\n选择插入块的直线,并再选择完成后单击鼠标右键") (setq a (ssget)) (setq b (cdr (assoc 2 (entget (car (entsel"\n选择要插入的块")))))) (setq c (getreal "\n输入插入块的数量并空格或回车:")) (setq d (+ c 1)) (command "DIVIDE" a "B" b "Y" d ) (princ) )
第一行:princ是个提示语,会输出到命令行。提示操作。
第二行:(setq a (ssget))实现的是选择直线操作。Ssget是选择集函数,即实现代码交互到图纸,选择图纸对象的函数。
第三行:(setq b (cdr (assoc 2 (entget (car (entsel"\n选择要插入的块"))))))实现的是选择插入的块,并提取块名操作。为了divide命令中的输入块名操作。
Entsel是选择块。
car是得到块在代码中的名字。
entget是获取块的整个图元列表,得到这个图元列表才能得到块在图纸中的名称。
Assoc是读取图元列表(2,“块名”),这个函数的意思是得到群码是2的图元列表。
cdr是为了得到“块名”,这个函数的意思是获取列表的第二个元素。
Setq是赋值函数,即将得到的“块名”,赋给b这个变量。
第四行:(setq c (getreal "\n输入插入块的数量:"))是命令行输入插入块的数量。
第五行:(setq d (+ c 1))是为了解决块的数量与分段数目的差值问题。由div命令可知,div输入的是分段数量,分段数量=块的数量+1,所以在程序中要解决,使得输入的块的数量,就是插入的块数量。
第六行:(command "DIVIDE" a "B" b "Y" d )就是运行divide命令的过程。Command就是运行cad的命令函数。
这行代码就是命令行输入div命令,选择直线(就是第二行把直线赋值给了a变量),选择插入块,输入块名(第三行代码把块名赋值给我b变量),是否对齐块对象yes,输入线段数目(第五行代码把数目赋值给了d变量)。即下图操作。
那么,加载插件,运行代码,详见如下动图演示。
以上,你会了吗?
千里之行始于日积月累。天才是需要天赋,是万里挑一的存在。芸芸众生才是常见。我们大都不是天生的大神,但可以一步一步靠近神。如果日积跬步没能到千里之外,但至少可以走到明天。只要肯走,明天终究要比今天要好上一天。
(完)


评论