找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 865|回复: 11

[原创]:智能的“命令提取”LSP函数

[复制链接]
发表于 2003-3-26 09:22:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
该程序如对你有帮助,请捧个场。   

                  智能的“命令提取”LSP函数

一,引言
   在ACAD绘图中,经常有这样的情形:图中已有一实体,例如一
"POLYLINE"实体,该实体处于图中的GJ层;线型为XX100;颜色为
RED;线宽为0.45.而当前的层;线型;颜色;线宽均不为上述值.
而这时又需要在上述"POLYLINE"实体所在的GJ层,绘制与该实
体具有相同的线型;相同的颜色;相同的线宽的另一"POLYLINE"
实体或其他实体时,如仅用ACAD命令操作需频繁调用ACAD菜单
或命令,如遗忘了某一特性还要现场查询,颇为费时.能否当点
选图中一实体后,便根据所点选的实体类型自动提取其相应的
特性且自动设置为当前特性,而且同时调用该实体的ACAD绘图
命令呢?答案是肯定的.例如当点选图中一文字"TEXT"实体后,
便自动将当前层设置为该文字所在图层;当前颜色设置为该文
字的颜色;当前文字的高度,字型等特性均设置为该文字的特性
且自动调用TEXT命令以进行文字书写,仿佛机算机明白操作者
的意图一般.这便是本文所提供的智能的"命令提取"功能.希望
能抛砖引玉。
二,程序设计思想
   程序首先利用entsel函数提示用户点选一实体,当选中一实
体后entsel函数返回该实体的实体名e_name,然后用entget函数
提取该实体的DXF数据e_data,再由e_data提取该实体的主实体类
型e_type,再根据e_type的不同情况分别处理,详见所附原程序.
这里需要说明的是,当主实体类型e_type为多义线"POLYLINE"时,
由于ACAD的绘图命令如多义线"PLINE"圆环"DONUT";椭圆"ELLIPSE"
多边形"POLYGON"等命令生成的实体的主实体类型均为多义线
"POLYLINE",因此此时应继续提取其子实体的DXF数据,以进一步
对所选实体进行判断.所附原程序仅对圆环"DONUT"做出判断,其余
实体的判断如认为有必要可自行加入.
三,程序调用方法
   用(load "mltq")命令将所附原程序MLTQ.LSP装入后,键入MLTQ
后便可调用.
四,源程序

  1. ;;;dxf函数接受实体的DXF码,返回特性数据
  2. (defun dxf (code elist)
  3.   (cdr (assoc code elist))
  4. )
  5. ;;;mltq命令提取主函数
  6. (defun c:mltq (/ mlst e_name e_data e_type e_layer
  7.                  e_width e_ltype e_color ename1
  8.                  edata1 xpt1 ename2 edata2 xpt2
  9.                  bulge insd outd)
  10.   (setvar "CMDECHO" 0)
  11.   (setq e_name (car (entsel "\n选择实体进行命令提取:\n")))
  12.   (if e_name
  13.     (progn
  14.       (setq e_data (entget e_name))
  15.       (setq e_type (dxf 0 e_data))   ;;;取主实体类型
  16.       (if (= e_type "POLYLINE")
  17.         (progn
  18.           ;;;取实体所在图层
  19.           (setq e_layer (dxf 8 e_data)     
  20.                 e_width  (dxf 40 e_data)   ;;;取实体的宽度
  21.                 e_ltype (dxf 6 e_data)     ;;;取实体的线型
  22.                 e_color (dxf 62 e_data))   ;;;取实体的颜色
  23.           (if (not e_ltype) (setq e_ltype "BYLAYER"))
  24.           (if (not e_color) (setq e_color "BYLAYER"))
  25.           (command "LAYER" "Set" e_layer "")
  26.           (command "COLOR" e_color)
  27.           (command "LINETYPE" "Set" e_ltype "")
  28.           (setvar "PLINEWID" e_width)
  29.            ;取第一子实体类型
  30.           (setq ename1 (entnext e_name))
  31.            ;取第一子实体数据
  32.           (setq edata1 (entget ename1))
  33.            ;取第一子实体顶点坐标
  34.           (setq xpt1 (car (dxf 10 edata1)))
  35.            ;取第一子实体凸度
  36.           (setq bulge (dxf 42 edata1))
  37.           (if (/= bulge 1)
  38.             (progn (princ "\nPLINE") (command "PLINE")))
  39.           (if (= bulge 1)
  40.             (progn
  41.               ;取第二子实体类型
  42.               (setq ename2 (entnext ename1))
  43.               ;取第二子实体数据
  44.               (setq edata2 (entget ename2))
  45.               ;取第二子实体顶点坐标
  46.               (setq xpt2 (car (dxf 10 edata2)))
  47.               ;求得圆环内径
  48.               (setq insd (- (abs (- xpt2 xpt1)) e_width))
  49.               ;求得圆环外径
  50.               (setq outd (+ (abs (- xpt2 xpt1)) e_width))
  51.               (setvar "DONUTID" insd)
  52.               (setvar "DONUTOD" outd)
  53.               (princ "\nDOUNT")
  54.               (command "DONUT")
  55.             )
  56.           )
  57.         )
  58.       )
  59.       (if (or (= e_type "LINE")
  60.               (= e_type "ARC")
  61.               (= e_type "CIRCLE")
  62.           )
  63.         (progn
  64.           (setq e_layer (dxf 8 e_data);取实体所在图层
  65.                 e_ltype (dxf 6 e_data);取实体的线型
  66.                 e_color (dxf 62 e_data));取实体的颜色
  67.           (if (not e_ltype) (setq e_ltype "BYLAYER"))
  68.           (if (not e_color) (setq e_color "BYLAYER"))
  69.           (command "LAYER" "Set" e_layer "")
  70.           (command "COLOR" e_color)
  71.           (command "LINETYPE" "Set" e_ltype "")
  72.           (cond
  73.             ((= e_type "LINE") (princ "\nLINE")
  74.              (command "LINE"))
  75.             ((= e_type "ARC") (princ "\nARC")
  76.              (command "ARC"))   
  77.             ((= e_type "CIRCLE") (princ "\nCIRCLE")
  78.              (command "CIRCLE"))   
  79.           )
  80.         )
  81.       )
  82.       (if (= e_type "TEXT")
  83.         (progn
  84.           (setq e_layer (dxf 8 e_data);取文字所在图层
  85.                 e_style (dxf 7  e_data);取文字字体
  86.                 e_color (dxf 62 e_data);取文字的颜色
  87.                 e_height (dxf 40 e_data);取文字高度
  88.                 e_angle (dxf 50 e_data);取文字旋转角度
  89.                 e_scale (dxf 41 e_data));取文字X向相对比例
  90.           (if (not e_color) (setq e_color "BYLAYER"))
  91.           (command "LAYER" "Set" e_layer "")
  92.           (command "COLOR" e_color)
  93.           (setvar "TEXTSTYLE" e_style)
  94.           (setvar "TEXTSIZE" e_height)
  95.           (princ "\nTEXT")
  96.           (command "TEXT")
  97.         )
  98.       )
  99.     )
  100.   )
  101.   (setvar "CMDECHO" 1)
  102.   (princ)
  103. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-3-27 12:36:42 | 显示全部楼层
还不是很完善,不过用的人自己再改进一下就很好用了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-30 05:03:01 | 显示全部楼层
泄的可以,学习学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-20 20:36:43 | 显示全部楼层
大家试用一下吧,怎么回音这么少?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-20 20:39:00 | 显示全部楼层
设想不错。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2003-5-20 21:15:46 | 显示全部楼层
这是一篇老文章了,和另外一篇关于"特定角度捕捉"的文章一样,好像都是在www.chinacad.com上的(1998年?),当时我琢磨了很久,觉得对自己帮助很多.
后来自己也写了这样的一个程序,不过实际工作中发现用户很少使用这个,我分析是大家已经有很深的习惯性的操作方式,如双击对象编辑,条件发射似的选择命令....
故而在最新的LKPT for 200x 中取消了这个程序.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-20 21:27:44 | 显示全部楼层
e2002斑竹你说的没错,这是我1998年发表在《CAD 与智能建筑》杂志上的一篇
文章,程序我一直再用,由于时间关系没有完善,拿出来就是想听听大家的意见。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2003-5-21 15:53:13 | 显示全部楼层
原来wang兄就是作者啊,幸会幸会!你的文章非常好,对我还有很多当时刚开始学习AutoLISP初学者帮助很大,非常感谢!
希望wang兄在论坛多多指教,发布更多有价值的原创好文!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-22 06:48:24 | 显示全部楼层
谢谢斑竹加积分和爱心币,我会继续努力。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-27 04:10:32 | 显示全部楼层
你的这篇文章我也看过的,虽然不是太使用(我认为的),但是拿来作为学习材料还是蛮好的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-27 09:39:51 | 显示全部楼层
不错的想法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-27 14:46:34 | 显示全部楼层
cad命令:_matchprop
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 09:51 , Processed in 0.196746 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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