明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7152|回复: 31

[源码] 说说最近在编的程

    [复制链接]
发表于 2013-4-14 22:36 | 显示全部楼层 |阅读模式
最近一直在为单位编制整套的图纸管理程序
主要功能包括
图框插入、图签编辑、目录生成、自动归档和批打印

其实这些程序很早以前就完成了
每个人看我用都说好
可就是无法推广
究其原因
是程序不适用于建筑结构专业
因为这两个专业的图名较复杂
我的图名只会是单行
而他们的图名双行很常见就不说了
中间还经常带轴号和标高
为了能让程序适用于每个人
这次几乎是重建了所有的代码


程序具体的工作流程是这样的
1.
建立两个标准化xls模板供调用
一个是◆标准工程信息模板A◆
包含工程名称、工程编号、子项名称、子项编号等
由项师生成【工程信息文件】填写后传各设计人员
一个是◆标准图纸目录模板B◆
包含专业、设、校、审人员姓名等
由各设计人员设置好后待调用

2.
程序复制模板B到工程所在文件夹下
根据读取【工程信息文件】的数据
建立各子项的空白目录页面
此为【预设图纸目录文件】(后面简称【预设】)
利用excel良好的编辑性能
可以较方便的输入图纸名称

3.
因为单位的图框带分区
一种图框就是一个块
标准与非标图框总数30+
重建所有图框
所有图框含相同的属性

4.
程序读取【预设】得到预设信息
在图框插入时自动为图框赋值
此时的图签
除图纸名称、图号、版别外
其它的公共信息均已赋值
同时也提供单独的命令
可以修改编辑这些公共信息

5.
为解决复杂图名的输入
这次没有采用属性
而是采用图名块的方式
即一张图纸对应一个图名块
为此建立了一个文字转化规则
a .@x@表示一个单轴号
b. $x%y$表示一个上下分的轴号
c. &x&表示一个标高
相应建立两个函数
分别用于文字到图名块的转化
和图名块解析到文字
这也是使用xls的重要原因
毕竟规则复杂后
需要范例图片帮助其它人理解
而XLS正好可以插入图片
也可以在非编辑区之外加上必要的提示

;老实说我现在真有点后悔这样做
;如果采用另一套规则
;图名依然采用属性
;特殊的图名在需要的位置加空格
;在计算出文字位置后添加轴号或标高
;这样速度方面可以提高很多
;唉
;这个话题放到最后再说

6.
在【预设】中输入图纸名称完成后
读取【预设】得到相关数据
依次点击图框
生成并放置对应的图名块
同时生成对应的目录块供调用

7.
图名填写到图签这一步完成后
读取相关数据
自动生成图纸目录
包括张数与折合A1的统计

8.
自动生成归档文件
所谓归档就是一张图一个文件
按工程编号+阶段专业+子项号+图号+版别组织图名
这是单位的硬性要求
除此之外程序还生成一个留底文件
就是归档名+图名
主要是为了方便自己以后查看

9.
自动批处理打印
包括硫酸图plt(图框原尺寸打印)
校审白图plt(图框缩小打印)
DWF、PDF等
PLT打印时自动拼图及统计打印总张数

10.
其它附带的后处理功能
a.文件夹内图纸批处理分解
b.随机改图名
c.图层合并
d.文件夹内图纸批处理转无名块
这样处理图纸当然是为了给甲方啦


这套程序耗费了我几乎一个月的时间
思路多次调整
代码反复修改+捉虫
现在总算接近完工
仅仅保留下来LSP和DCL这样的纯文本
总字节数已经219K
但是我现在除了一点点的喜悦之外
更多的是的郁闷
整套程序最关键的一个功能
连续点击图框添加图名块这一步
运行起来很慢
这也就是前面之所以吐槽的原因
一开始是瞬间完成
大概在连点20个以后
再每点一次大约要比前一次多出几秒
到40个以后基本上就定住了

这是很麻烦的
就好象我以前的程序
虽然大家都很喜欢后面的归档、批打印功能
但是一听需要换用我的图框
一个个都不吭气了
其实即便是以前的图框不支持特殊图名
可需要用到特殊图名的又有几张图呢
宁愿手工编辑图签
一张张归档、打印
也不愿意更换一下图框

这次的程序将由单位组织推广
对很多人来说
接受新事物做出一些习惯上的调整
那是很难的
使用时再要有一些不顺畅
那就更难了
所以这个速度问题不能很好的解决
对程序的推广那是致命的

关于提高速度
1.
原先采用command建图元
准备改成entmake
2.
图名块的解析
原来为省事是炸开后解析再回退
现在要改成直接读取块定义
3.
非常用的函数名定义为程序的内参
4.
成品编译成fas或vlx

除此之外还有什么招
大家提醒一下
现在脑袋晕得厉害

请教个问题
对于复杂图名
我的图名块实际上是个嵌套块
块内块都是带属性的
读取块定义
可以得到文字的值
也可以得到内部块的块名和属性值
这样图名块解析到文字
这个不存在障碍
反过来要根据文字转化为块时
要如何做?
entmake 如何构建复杂图元
找不到实例
谁能提供一个啊?
entmakex这个函数又该怎么用?
现在我是在图中先构建出图元
设定选择集后
用command做块
再插入到图签的某个位置
如果可以直接构建出块的定义
那么就不用反复的定义选择集
大量的选择集是影响速度的重要原因之一


这些优化工作完成后
如果速度方面还存在问题
那就只有一个办法了
刚刚想到的
图框内增加图名用的属性
纯文字图名用属性
特殊图名再用图名块

也许我现在就应该直接这样修改
这么做速度方面肯定没问题
图块增加的也不多
郁闷了了好几天
终于看到曙光了
让我大笑三声先



最后感谢一下G版
在我的程序编制过程中
提供的EXCEL操控源代码
实在太有帮助了









评分

参与人数 3明经币 +5 金钱 +15 收起 理由
gbhsu + 2 赞一个!
xiaxiang + 1 + 15 赞一个!
Gu_xl + 2 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2013-4-18 10:02 | 显示全部楼层
adolfken 发表于 2013-4-18 07:31
弱弱的问下 为什么不用图纸集?

你说的图纸集指的是什么
回复 支持 0 反对 1

使用道具 举报

发表于 2017-8-31 13:10 来自手机 | 显示全部楼层
给楼主点赞,一个月做好这么多功能很厉害了。思路虽然不是很清晰,跟我很像。不过我觉得整体没规划好,首先你自己都不满意;其次,规则太多太复杂,不好用,要是我呢,会图框,图签,会签栏单独,三个做成组选,图名限定在框框内,直接缩放复制到目录,如果是两行则去掉目录一条横线。不管图纸大小,瞬间完成。
 楼主| 发表于 2017-8-31 18:18 | 显示全部楼层
旧帖被顶起来了

简单说说关于图名块最后采取的方法
主要就是特殊图名前加一个“#”作为标示符
如果是普通文字组成的图名
字高按图框比例设定
如果是特殊图名字高设定为0.001
这样读取图框块属性
就可以直接判断是否特殊图名
再执行相应的流程
发表于 2013-4-14 23:03 | 显示全部楼层
这事也要发个贴说下?感觉是个日记嘛!还以为要源码供大家学习呢!
发表于 2013-4-14 23:05 | 显示全部楼层
写的很好。学习了一些思路。
发表于 2013-4-15 09:35 | 显示全部楼层
本帖最后由 x_s_s_1 于 2013-4-15 09:37 编辑

搞个非属性块的 ,代码是自动生成的,比较啰嗦
  1. (defun 螺钉st6.3 (/ pt)
  2.   (If (TblSearch "BLOCK" "螺钉st6.3")
  3.     (entmake
  4.       (list '(0 . "INSERT")
  5.             (cons 2 "螺钉st6.3")
  6.             (cons 8 "紧固件")
  7.             (cons 10 (setq pt (getpoint "\n输入插入点:")))
  8.             (cons 50
  9.                   (+ (/ pi 2) (angle pt (getpoint pt "\n插入角度:")))
  10.             )
  11.       )
  12.     )
  13.     (progn (EntMake '((0 . "BLOCK")
  14.                       (2 . "螺钉st6.3")
  15.                       (100 . "AcDbBlockReference")
  16.                       (70 . 0)
  17.                       (10 -27.584 -11.4993 0.0)
  18.                      )
  19.            )
  20.            (entmake '((0 . "CIRCLE")
  21.                       (100 . "AcDbEntity")
  22.                       (67 . 0)
  23.                       (8 . "0")
  24.                       (100 . "AcDbCircle")
  25.                       (10 -27.584 -11.4993 0.0)
  26.                       (40 . 6.6)
  27.                       (210 0.0 0.0 1.0)
  28.                      )
  29.            )
  30.            (entmake '((0 . "LINE")
  31.                       (100 . "AcDbEntity")
  32.                       (67 . 0)
  33.                       (8 . "0")
  34.                       (62 . 9)
  35.                       (6 . "CENTER")
  36.                       (48 . 0.25)
  37.                       (100 . "AcDbLine")
  38.                       (10 -27.584 -3.78501 0.0)
  39.                       (11 -27.584 -19.2136 0.0)
  40.                       (210 0.0 0.0 1.0)
  41.                      )
  42.            )
  43.            (entmake '((0 . "LWPOLYLINE")
  44.                       (100 . "AcDbEntity")
  45.                       (67 . 0)
  46.                       (8 . "0")
  47.                       (100 . "AcDbPolyline")
  48.                       (90 . 6)
  49.                       (70 . 1)
  50.                       (43 . 0.0)
  51.                       (38 . 0.0)
  52.                       (39 . 0.0)
  53.                       (10 -22.584 -8.61255)
  54.                       (40 . 0.0)
  55.                       (41 . 0.0)
  56.                       (42 . 0.0)
  57.                       (10 -22.584 -14.3861)
  58.                       (40 . 0.0)
  59.                       (41 . 0.0)
  60.                       (42 . 0.0)
  61.                       (10 -27.584 -17.2728)
  62.                       (40 . 0.0)
  63.                       (41 . 0.0)
  64.                       (42 . 0.0)
  65.                       (10 -32.584 -14.3861)
  66.                       (40 . 0.0)
  67.                       (41 . 0.0)
  68.                       (42 . 0.0)
  69.                       (10 -32.584 -8.61255)
  70.                       (40 . 0.0)
  71.                       (41 . 0.0)
  72.                       (42 . 0.0)
  73.                       (10 -27.584 -5.7258)
  74.                       (40 . 0.0)
  75.                       (41 . 0.0)
  76.                       (42 . 0.0)
  77.                       (210 0.0 0.0 1.0)
  78.                      )
  79.            )
  80.            (entmake '((0 . "LINE")
  81.                       (100 . "AcDbEntity")
  82.                       (67 . 0)
  83.                       (8 . "0")
  84.                       (62 . 9)
  85.                       (6 . "CENTER")
  86.                       (48 . 0.25)
  87.                       (100 . "AcDbLine")
  88.                       (10 -19.8697 -11.4993 0.0)
  89.                       (11 -35.2983 -11.4993 0.0)
  90.                       (210 0.0 0.0 1.0)
  91.                      )
  92.            )
  93.            (entmake '((0 . "CIRCLE")
  94.                       (100 . "AcDbEntity")
  95.                       (67 . 0)
  96.                       (8 . "0")
  97.                       (100 . "AcDbCircle")
  98.                       (10 -27.584 -11.4993 0.0)
  99.                       (40 . 5.0)
  100.                       (210 0.0 0.0 1.0)
  101.                      )
  102.            )
  103.            (EntMake '((0 . "ENDBLK")))
  104.            (entmake
  105.              (list '(0 . "INSERT")
  106.                    (cons 2 "螺钉st6.3")
  107.                    (cons 8 "紧固件")
  108.                    (cons 10 (setq pt (getpoint)))
  109.                    (cons 50 (+ (/ pi 2) (angle pt (getpoint pt))))
  110.              )
  111.            )
  112.     )
  113.   )
  114.   (princ)
  115. )
发表于 2013-4-15 09:41 | 显示全部楼层
wowan1314 发表于 2013-4-14 23:03
这事也要发个贴说下?感觉是个日记嘛!还以为要源码供大家学习呢!

编程首先是思路,然后才是代码。学习别人的编程思路比直接给源码强多了。
发表于 2013-4-15 09:50 | 显示全部楼层
mccad 发表于 2013-4-15 09:41
编程首先是思路,然后才是代码。学习别人的编程思路比直接给源码强多了。

没觉的楼主是在分享编程思路,只是篇日记而已。
如果是日记我觉的发在自己的空间就好啦。
发在这里,分享的成分少,倒觉的是炫耀的成分大。

仅个人观点,就事论事。
发表于 2013-4-15 11:02 | 显示全部楼层
搞个属性块的,写的不一定对,思路肯定是对的
  1. ;;;属性块
  2. (defun emk_BLOCK (BlockName)
  3.   (entmake (list '(0 . "BLOCK")'(10 0.0 0.0 0.0)'(70 . 2)(cons 2 BlockName)))
  4. )
  5. ;;;圆
  6. (defun emk_CIR(CenterPoint Radius layer)
  7.   (entmake (list '(0 . "CIRCLE")'(100 . "AcDbEntity")(cons 8 layer)'(100 . "AcDbCircle")(cons 10 Centerpoint)(cons 40 Radius)))
  8. )
  9. ;;;直线
  10. (defun emk_LINE (StartPoint EndPoint layer)
  11.   (entmake (list '(0 . "LINE")'(100 . "AcDbEntity")(CONS 8 LAYER)'(100 . "AcDbLine")(cons 10 StartPoint)(cons 11 EndPoint)))
  12. )
  13. ;;;属性定义
  14. (defun emk_ATTDEF (LAYER startPoin Height Value Width TextStyle Horizontal AlignPoint Pmpt Tag Visibility Vertical)
  15.   (entmake
  16.     (list
  17.       '(0 . "ATTDEF")
  18.       '(100 . "AcDbEntity")
  19.       (CONS 8 LAYER)
  20.       '(100 . "AcDbText")
  21.       (cons 10 startPoin);(-2 -2)
  22.       (cons 40 Height);4
  23.       (cons 1 Value);AXISTAG
  24.       (cons 41 Width);4
  25.       (cons 7 TextStyle);complex
  26.       (cons 72 Horizontal);5
  27.       (cons 11 AlignPoint);(2 -2)
  28.       '(100 . "AcDbAttributeDefinition")
  29.       (cons 3 Pmpt);""
  30.       (cons 2 Tag);A
  31.       (cons 70 Visibility);0
  32.       (cons 74 Vertical);0
  33.     )
  34.   )
  35. )

  36. ;;;块属性
  37. (defun EMK_ATTRIB (LAYER startPoin Height Value Width TextStyle Horizontal AlignPoint Tag Visibility Vertical SCL)
  38.   (entmake
  39.     (list
  40.       '(0 . "ATTRIB")
  41.       '(100 . "AcDbEntity")
  42.       (CONS 8 LAYER)
  43.       '(100 . "AcDbText")
  44.       (cons 10 startPoin);(-2 -2)
  45.       (cons 40 (* Height scl))
  46.       (cons 1 Value)
  47.       (cons 41 Width)
  48.       (cons 7 TextStyle)
  49.       (cons 72 Horizontal)
  50.       (cons 11 AlignPoint)
  51.       '(100 . "AcDbAttribute")
  52.       (cons 2 Tag)
  53.       (cons 70 Visibility)
  54.       (cons 74 Vertical)
  55.     )
  56.   )
  57. )

  58. ;;;插入属性块
  59. (defun INS_ATT_BLK (BlockName PNT scl layer)
  60.   (entmake (list '(0 . "INSERT")(cons 2 BlockName)(cons 8 layer)'(66 . 1)(cons 10 PNT)(cons 41 scl)(cons 42 scl)))
  61. )
  62. (if (not (tblsearch "BLOCK" "axistag"))
  63.   (PROGN
  64.     (emk_BLOCK "axistag")
  65.     (emk_CIR '(0 0) 4 "AXISDIM")
  66.     (emk_ATTDEF
  67.       "AXISTANG"
  68.       '(-2 -2)
  69.       4
  70.       "AXISTAG"
  71.       4
  72.       "complex"
  73.       5
  74.       '(2 -2)
  75.       ""
  76.       "A"
  77.       0
  78.       0
  79.     ) ;_ 结束emk_ATTDEF
  80.     (entmake '((0 . "ENDBLK")))
  81.   ) ;_ 结束PROGN
  82. ) ;_ 结束if
  83. (INS_ATT_BLK "axistag" (SETQ PT (GETPOINT "\n插入点:")) 100 "AXISDIM")
  84.     (emk_ATTRIB
  85.       "AXISTANG"
  86.       (POLAR PT (* 5 0.785398) 282.843)
  87.       4
  88.       "B"
  89.       4
  90.       "complex"
  91.       5
  92.       (POLAR PT (* 7 0.785398) 282.843)
  93.       "AXISTAG"
  94.       0
  95.       0
  96.       100
  97.     ) ;_ 结束emk_ATTRIB
  98. (entmake '((0 . "SEQEND")))
  99. (if (not (tblsearch "BLOCK" "axistag2"))
  100.   (PROGN
  101.     (emk_BLOCK "axistag2")
  102.     (emk_CIR '(0 0) 4 "AXISDIM")
  103.     (emk_LINE '(-2.82843 -2.82843) '(2.82843 2.82843) "AXISDIM")
  104.     (emk_ATTDEF
  105.       "AXISTANG"
  106.       '(-2 -2)
  107.       4
  108.       "AXISTAG"
  109.       4
  110.       "complex"
  111.       5
  112.       '(2 -2)
  113.       ""
  114.       "A"
  115.       0
  116.       0
  117.     ) ;_ 结束emk_ATTDEF
  118.     (entmake '((0 . "ENDBLK")))
  119.   ) ;_ 结束PROGN
  120. ) ;_ 结束if
  121. (INS_ATT_BLK "axistag2" (SETQ PT (GETPOINT "\n插入点:")) 100 "AXISDIM")
  122.     (emk_ATTRIB
  123.       "AXISTANG"
  124.       (POLAR PT (* 5 0.785398) 282.843)
  125.       4
  126.       "B"
  127.       4
  128.       "complex"
  129.       5
  130.       (POLAR PT (* 7 0.785398) 282.843)
  131.       "AXISTAG"
  132.       0
  133.       0
  134.       100
  135.     ) ;_ 结束emk_ATTRIB
  136. (entmake '((0 . "SEQEND")))
发表于 2013-4-15 13:25 | 显示全部楼层
先不要浪費時間在command和entmake上
发表于 2013-4-15 14:37 | 显示全部楼层
顶起!程序的思路相当有用,可以给后来者提供借鉴。而且就算给出源码,也非得消化成适合自己应用环境的东西。
但是建议楼主认真整理为一个编程日志,将之写为一个开发心路历程或是什么的,是不是更好一些呢?程序放不放出来倒在其次,因为对于不懂行的人,手把手他都用不了。
 楼主| 发表于 2013-4-15 19:04 | 显示全部楼层
感谢楼上诸位的关注
特别要感谢x_s_s_1 提供的源码
今晚要好好研究一下

写这个帖子当然不是炫耀
论坛里的高手太多太多
想炫耀没本钱啊
说没有编程思路
这个观点也不能认同
比如标准化模板的设置
比如图签插入时自动赋值
还有复杂图名与文字的转换
其实都是可以分享的经验

昨天晚上编程编到头疼
突然很想写点东西发上来
主要是想整理下思路
同时有些疑问寻求解答
事实证明这事做对了
帖子写到末尾的时候
思路一下开阔了
属性结合图名块也许不是最好的方式
但比全部图名块要好很多

xiaxiang版主说得很好
等程序完成后
一定会认真整理个日志出来
源码也会拿出来
别的不敢说
易用性方面一定不会差的




您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-13 11:31 , Processed in 0.191607 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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