vectra 发表于 2014-10-21 17:26:00

参数块,以及自动编写代码

本帖最后由 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

目前无修改参数块功能,欢迎各种测试、反馈,建议。。。也希望你能分享一些好的参数块函数或尺寸数据,如果程序做成发行了,可能也会有你的一部分功劳。

00放飞梦想00 发表于 2022-7-4 07:12:12

fullfill 发表于 2014-10-23 16:53
建议参考msteel的扩展绘图功能,那个东西不会lisp的都能定制自己的参数化程序,只是需要一个平台,就是一大 ...

大佬能不能把链接发一下,谢谢!

lucas_3333 发表于 2014-10-21 17:38:57

大师最近高产啊! 佩服! 赞!

spp_wall 发表于 2014-10-21 17:45:22

高端什么是参数块?

firstinti 发表于 2014-10-21 19:43:42

感谢无私分享,这个程序如果能完善做出来将会造福民生,作用不会小于小菜的选择易

fan_zh 发表于 2014-10-22 09:31:16

学习了,先收藏

伪书虫86 发表于 2014-10-22 10:05:27

先MARK了,等养肥了再来

zhengchuan 发表于 2014-10-22 13:02:33

学习了,先收藏

phoevana 发表于 2014-10-23 07:59:20

,没看明白,而且好贵,不过支持

fullfill 发表于 2014-10-23 16:53:02

建议参考msteel的扩展绘图功能,那个东西不会lisp的都能定制自己的参数化程序,只是需要一个平台,就是一大批人共同定制共享才能彰显威力

机械工程师 发表于 2014-10-23 17:34:17

怎么用

命令: (LOAD "D:/Career/Desktop/lsp/BlockCreator/BlockCreator.fas")
命令: BlockCreator
未知命令“BLOCKCREATOR”。按 F1 查看帮助。

命令: call
输入调用的函数名称:test
输入参数列表:"(100 200)"
执行函数发生错误。"执行函数发生错误。"
页: [1] 2
查看完整版本: 参数块,以及自动编写代码