明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4530|回复: 18

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

  [复制链接]
发表于 2014-10-21 17:26 | 显示全部楼层 |阅读模式
本帖最后由 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,并为此定义一个函数。

  1. (defun create-line (p1 /)
  2.   (list
  3.     (list '(0 . "LINE") '(10 0 0) (11 p1 0))
  4.   )
  5. )


根据直线长度输入不同的参数 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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
spp_wall + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

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

大佬能不能把链接发一下,谢谢!
发表于 2014-10-21 17:38 | 显示全部楼层
大师最近高产啊! 佩服! 赞!
发表于 2014-10-21 17:45 | 显示全部楼层
高端  什么是参数块?
发表于 2014-10-21 19:43 | 显示全部楼层
感谢无私分享,这个程序如果能完善做出来将会造福民生,作用不会小于小菜的选择易
发表于 2014-10-22 09:31 | 显示全部楼层
学习了,先收藏
发表于 2014-10-22 10:05 | 显示全部楼层
先MARK了,等养肥了再来
发表于 2014-10-22 13:02 | 显示全部楼层
学习了,先收藏
发表于 2014-10-23 07:59 | 显示全部楼层
,没看明白,而且好贵,不过支持
发表于 2014-10-23 16:53 | 显示全部楼层
建议参考msteel的扩展绘图功能,那个东西不会lisp的都能定制自己的参数化程序,只是需要一个平台,就是一大批人共同定制共享才能彰显威力
发表于 2014-10-23 17:34 | 显示全部楼层
怎么用

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

命令: call
输入调用的函数名称:test
输入参数列表:"(100 200)"
执行函数发生错误。"执行函数发生错误。"

点评

"运行命令PB"  发表于 2014-10-23 19:39
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-19 19:53 , Processed in 0.354774 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表