本帖最后由 vectra 于 2014-10-22 09:46 编辑
前言
对于参数化绘图,动态块这样的话题,被讨论了许多。当我们需要管理一个块的许多规格时,单纯地做出一批块费时费力,难以维护。ACAD引入动态块的解决方案。然而动态块存在一些不足:
1、实现不够优雅。动态块恐怕是ACAD中最为难以学习掌握的一种对象类型。繁杂的约束和定义让人望而却步;
2、规格尺寸数据与块绑定一起,不方便管理。假如规格数据修改了,而你定义的动态块在成千上万个DWG文件中使用,怎样去更新所有块呢;
3、修改了动态块的定义,难以应用到不同DWG中;
4、其动态性还是受到很大的制约。比如不能在动态块中引用另一个动态块。有了许多零部件,却不能组装成一部机器。
……
参数块设计目标
为了弥补上述不足,我开始研究和制作“参数块”,在没有辅助编程软件之前,唯一的要求是,制作块的人需要懂得一点LISP编程。因为说到底,参数块就是一个定义好的绘图过程,一段LISP代码,它返回符合CAD标准的,用于创建一系列图元的组码列表。
比如对于表 ‘((0 . "LINE") (10 0 0 0) (11 100 0 0)),将其做为参数传入entmak即可创建一条从(0,0)到(100,0)的直线,现在有一批不同长度的直线需要创建,唯一需要修改的就是100这个数值,于是需要把100转化为变量P1,并为此定义一个函数。
 - (defun create-line (p1 /)
- (list
- (list '(0 . "LINE") '(10 0 0) (11 p1 0))
- )
- )
根据直线长度输入不同的参数 P1,调用代码并将结果传给entmake即可生成所需实体,加入到块或匿名块中。参数P1可以手工输入或从预先定义的外部数据文件中获取(最简单莫过于采用CSV文件,你可以用记事本编辑它)。记录生成时采用的参数,修改时按新提供的参数调用创建函数,即可实现参数块的修改。这是参数块的基本思路。
参数块的载体就是普通块或匿名块,生成参数保存在扩展数据上。可以理解参数块为一个带参数的LISP函数。
分析它的优点:
1、代码和尺寸数据都是全局的,独立于DWG文件,易于修改和发布,修改代码或尺寸数据将作用于所有DWG文件,可以手动批量更新已有图中的块;
2、没有代码的人无法按代码的规则编辑修改图中的块,实现保密;
3、代码可以编译为FAS或VLX,实现加密共享;
4、代码可以通过配置文件与不同尺寸数据文件连接,实现代码重用;比如画不同厂家,不同规格的阀门,只要画的内容一样,就可以调用相同的代码;
5、代码可以利用LISP的所有功能,可以使用循环、分支以及任意语法;甚至可以调用其它参数块代码;
未完待补。。。先贴上源码大家研究。
关于自动编写代码
写了一些代码之后,对LISP中数据和程序的界限感到越来越模糊。LISP的精妙就在于程序有时就是数据,而数据有时就是程序。
附件主要是研究测试自动编写参数块代码,玩法参考下面的提示
命令: make
制作参数块
选择对象: 指定对角点: 找到 4 个
选择对象:
指定基点:输入函数名称:test
(DEFUN TEST (P0 P1) (LIST (LIST (QUOTE (0 . "LINE")) (QUOTE (100 .
"AcDbEntity")) (QUOTE (100 . "AcDbLine")) (LIST 10 P1 P0 0.0) (LIST 11 (- P1)
(- P0) 0.0)) (LIST (QUOTE (0 . "LINE")) (QUOTE (100 . "AcDbEntity")) (QUOTE
(100 . "AcDbLine")) (LIST 10 P1 (- P0) 0.0) (LIST 11 P1 P0 0.0)) (LIST (QUOTE
(0 . "LINE")) (QUOTE (100 . "AcDbEntity")) (QUOTE (100 . "AcDbLine")) (LIST 10
(- P1) P0 0.0) (LIST 11 P1 (- P0) 0.0)) (LIST (QUOTE (0 . "LINE")) (QUOTE (100
. "AcDbEntity")) (QUOTE (100 . "AcDbLine")) (LIST 10 (- P1) (- P0) 0.0) (LIST
11 (- P1) P0 0.0))))
命令:
命令: call
输入调用的函数名称:test
输入参数列表:"(200 300)"
(<图元名: 7ec592e0> <图元名: 7ec592e8> <图元名: 7ec592f0> <图元名: 7ec592f8>)
在命令行中输入包含空格的字符串时需要前后加上引号,可以看到,对象已经按输入的参数创建出来了,而且创建他们的代码是自动生成的!
安装测试需修改BlockCreator.lsp文件第377行 (setq mt-blockcreator-path "D:\\Career\\Desktop\\lsp\\BlockCreator\\"),将其设置为程序解压目录,然后加载该文件,运行命令PB
目前无修改参数块功能,欢迎各种测试、反馈,建议。。。也希望你能分享一些好的参数块函数或尺寸数据,如果程序做成发行了,可能也会有你的一部分功劳。 |