明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2366|回复: 6

[求助]lisp有什么方法可以得到标注箭头的坐标点?

[复制链接]
发表于 2009-6-5 08:50:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-6-7 0:10:04 编辑

lisp有什么方法可以得到标注箭头的坐标点?(如下图的p1 p2 p3 p4的点?)
我想得到某个标注两个箭头的坐标点,然后进行一些操作,可是不知如何取得

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-6-5 12:13:00 | 显示全部楼层
只能通过计算得到。
 楼主| 发表于 2009-6-5 22:29:00 | 显示全部楼层
ZZXXQQ发表于2009-6-5 12:13:00只能通过计算得到。

如何计算呀?想半天想不出头绪

发表于 2009-6-6 11:58:00 | 显示全部楼层
试试看:
游客,本帖隐藏的内容需要发帖数高于 5 才可浏览,你当前发帖数只有 0

 楼主| 发表于 2009-6-6 13:36:00 | 显示全部楼层
ZZXXQQ发表于2009-6-6 11:58:00试试看:

谢谢:但此程序仅适用角度标注,通用性不大,我所要求的是适用于所有标注的,包括线性标注,对齐标注,角度,弧长,直径,半径,折弯半径,引线标注等,

  这两天在网上找了好多资料,受到一点起发,现在我也已经差不多编出了,现在在测试,晚上再发上来(适用所有标注)

 楼主| 发表于 2009-6-6 19:58:00 | 显示全部楼层
本帖最后由 作者 于 2009-6-7 15:22:04 编辑

呵呵,终于搞店,这是本人的笨办法!本人是初学lisp,而且没学过其他任何语言,所以程序编得很乱,请版主指出对的地方!

;功能:获得标注箭头的点坐标(在2006 2010测试能通过,需调用lt:ss-entnext和arrow_type子函数,见下面)
;用法:(clh-getdimarrp 图元名)
;返回:如果是具有两个箭头的标注,则返回(<第一箭头点> <第二箭头点> ) ;如果是只有单箭头的标注如半径或引线等,则返回(<箭头点>)
注意:如果标注的箭头被人为的翻转过,则取出的点的顺序可能会改变成(<第二箭头点> <第一箭头点> ),这是本程序的不足处
;举例:(clh-getdimarrp ( car (entsel)))
;可以用(getpoint)验证一下看看。
(defun clh-getdimarrp (ent / en enn tylx ass ss i dimarrp dysjb lx p1)
 (command "circle" '(0 0 0) "1")
 (setq en (entlast))
 (command "copy" ent "" '(0 0 0) "")
 (setq enn (entlast))
 (arrow_type enn 0 0);将标注第一箭头的箭头类型统一改为箭头
 (arrow_type enn 0 1);将标注第二箭头的箭头类型统一改为箭头
 (setq tylx (cdr (assoc 0 (entget enn))))
 (if (or (= tylx "LEADER") (= tylx "MULTILEADER")) (setq ass 11) (setq ass 13));如果为引线或多重引线标注
 (command "explode" enn)
 (setq ss (lt:ss-entnext enn))
 (setq i 0 dimarrp nil)
 (repeat (sslength ss)
   (setq dysjb (entget(ssname ss i))  lx (cdr (assoc 0  dysjb)))
   (if (= lx "SOLID") (setq p1 (list (cdr (assoc ass  dysjb))) dimarrp (append p1 dimarrp)))
   (setq i (1+ i))
 );repeat
 (command "erase" ss "")
 (entdel en)
 (setq dimarrp (reverse dimarrp))
);defun

;功能:获取在图元 en 之后产生的图元的选择集
;来源:网上搜索
;; [测试]1.(setq en (entlast))
;;         执行创建图元的命令,如 LINE,BOUNDARY
;;         (setq ss (lt:ss-entnext en))
;;       2.(setq ss (lt:ss-entnext (car(entsel))))
(defun lt:ss-entnext (en / ss)
   (if en
     (progn
       (setq ss (ssadd))
       (while (setq en (entnext en))
         (if (not (member (cdr (assoc 0 (entget en)))
                          '("ATTRIB" "VERTEX" "SEQEND")
                  )
             )
           (ssadd en ss)
         )
       )
       (if (zerop (sslength ss)) (setq ss nil))
       ss
     )
     (ssget "_x")
   )
)

;功能:更改标注箭头(参考http://www.01internet.com/asp/ShowRecord.asp?WebName=AutoCAD&ID=15881资料修改成的)
;用法:(arrow_type 图元名  箭头类型  起终点标志符)
;箭头类型:11小点;19无;0箭头;5斜线(具体可用下面的vl_view函数查询Arrowhead1Type和Arrowhead2Type的值)
;起终点标志符:0为起点箭头 非0为终点箭头;如果为半径或折弯半径或引线标注,则起终点参数可为任何值(但也不能省掉)
;举例:(arrow_type (car (  entsel))  11  0)起点箭头将被改为一个小园点
(defun arrow_type (ent type borl / vl_ent dtype)
  (setvar "cmdecho" 0)
  (vl-load-com)
  (setq vl_ent (vlax-ename->vla-object ent))
  (setq dtype (cdr(assoc 100 (reverse (entget ent)))))
  (if (or (= dtype "AcDbRadialDimension");半径
          (= dtype "AcDbRadialDimensionLarge");折弯半径
    (= dtype "AcDbLeader");引线
    (= dtype "AcDbMLeader");多重引线
   );or
   (vla-put-arrowheadtype vl_ent type)
   (if (= borl 0)
        (vla-put-arrowhead1type vl_ent type)
        (vla-put-arrowhead2type vl_ent type)
      );if
  );if
  (princ)
)

 楼主| 发表于 2009-6-7 15:27:00 | 显示全部楼层

 

更新了代码,改正了上面的“如果标注的箭头被人为的翻转过,则取出的点的顺序可能会改变成(<第二箭头点> <第一箭头点> ),这是本程序的不足处”的问题.

代码见附件

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-24 23:25 , Processed in 0.204636 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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