找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 827|回复: 12

[LISP程序]:提供一个“文字与直线平行程”的实用程序,欢迎大家提意见

[复制链接]
发表于 2005-3-3 20:11:17 | 显示全部楼层 |阅读模式

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

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

×
(defun c:test()
  (setq pt1 (getpoint "\n选择直线的第一点"))
  (setq pt2 (getpoint pt1 "\n选择直线的第二点"))
  (setq ang (angle pt1 pt2))
  (setq ss (ssget '((0 . "text"))))
  (setq i -1)
  (while   (setq en (ssname ss (setq i (1+ i))))
           (setq ddate (entget en))
           (setq pt (cdr (assoc 10 ddate)))
           (setq jd (cdr(assoc 50 ddate)))
           (command "select" "l" "")
           (command "rotate" ss "" pt (angtos(- ang jd)0 2))
     
  )
  )
(prompt "\n文字与直线平行程序,键入:test执行---------------程序设计:小谢")
(princ)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-3-3 20:30:23 | 显示全部楼层
1.不先鎖點"端點"會有誤差
2.選直線求ang就好了,不需點二點再求ang
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-3 23:57:28 | 显示全部楼层
我以前也写过一样的东西,当初我的输入是一条线取dxf 10 ,11,判断转角避免倒字,用entmode更新50(我想速度可以快点),避免捕捉的保存,我找到代码了
(DEFUN C:RR (/ LINEENT TEXTENT LINEANGLE PTS PTE)
  (SETQ LINEENT (ENTSEL))
  (IF LINEENT
   (PROGN
      (SETQ LINEENT (ENTGET (CAR LINEENT)))
      (IF (= "LINE" (DXF 0 LINEENT))
        (PROGN
          (SETQ PTS (DXF 10 LINEENT))
          (SETQ PTE (DXF 11 LINEENT))
          (SETQ LINEANGLE (ANGLE PTS PTE))
          (IF (> LINEANGLE (/ PI 2.0)) (SETQ LINEANGLE (- LINEANGLE Pi)))
          (IF (> LINEANGLE (/ PI 2.0)) (SETQ LINEANGLE (- LINEANGLE Pi)))
          (SETQ TEXTENT (ENTSEL "\nTEXT"))
          (IF TEXTENT
              (PROGN
                (SETQ TEXTENT (ENTGET (CAR TEXTENT)))
                (SETQ TEXTENT (SUBST (CONS 50 LINEANGLE) (ASSOC 50 TEXTENT) TEXTENT))
                (Ai_UNDO_PUSH)
                (ENTMOD TEXTENT)
                (AI_UNDO_POP)
              );PROGN
          );IF
        );PROGN
      );IF
    );PROGN
  );FI
);DEFUN
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-3-4 12:49:21 | 显示全部楼层
用entsel选直线,然后用组码10,11来取端点,不要用getpoint。
而且,在angle中要判断直线的角度,要不然会出现倒字的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-5 11:12:06 | 显示全部楼层
2楼楼主说:   9pt 10pt 11pt 12pt 13pt 15pt  

1.不先鎖點"端點"會有誤差
2.選直線求ang就好了,不需點二點再求ang  


如果对象是多义线,又该如何???、
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-5 11:56:33 | 显示全部楼层
如果是两点连线的多义线,也可以直接由两点来ang,2楼提得第2点还是有道理的,而且实际操作也应该如此。另外还需要考虑一点,就是如果空选,则采用1楼楼主的操作,选择两点,我认为一个好的程序,就应该尽可能适合于不同情况下的操作。
以下程序是我修改过的,暂不支持多义线:
(defun c:test ()
  (setq ss (ssget '((0 . "text"))))
  (if (/= (setq ent (car (entsel "\n选择一条直线: "))) nil)
    (progn
      (setq obj (vlax-ename->vla-object ent))
      (setq ang (vla-get-Angle obj))
    )
    (progn
      (setq pt1 (getpoint "\n选择对齐的第一点"))
      (setq pt2 (getpoint pt1 "\n选择对齐的第二点"))
      (setq ang (angle pt1 pt2))
    )
  )
  (cond        ((and (> ang (* pi 0.5)) (< ang pi))
         (setq ang (+ ang pi))
        )
        ((and (> ang pi) (< ang (* pi 1.5)))
         (setq ang (- ang pi))
        )
        ((= ang pi) (setq ang 0))
        ((= ang (* pi 1.5)) (setq ang (* pi 0.5)))
        (T (setq ang ang))
  )
  (setq        len (sslength ss)
        i   0
  )
  (repeat len
    (setq ent1 (ssname ss i))
    (setq obj1 (vlax-ename->vla-object ent1))
    (vla-put-Rotation obj1 ang)
    (setq i (1+ i))
  )
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-3-5 16:19:48 | 显示全部楼层
;对三楼程序稍修改,支持多义线,大家提提意见
(DEFUN C:test(/ LINEENT TEXTENT LINEANGLE PTS PTE)
(SETQ LINEEN (ENTSEL))
(if (= (cdr(assoc 0 (entget(car lineen)))) "LWPOLYLINE")
   (PROGN
     (command "explode" (car lineen) "")
     (alert "\n将多义线分解,请选择直线")
     (SETQ LINEEN (ENTSEL"\n选择直线"))
     (redraw (car lineen) 3)
     (IF LINEEN
       (PROGN
       (SETQ LINEENT (ENTGET (CAR LINEEN)))
       (SETQ PTS (cdr(assoc 10 LINEENT)))
       (SETQ PTE (cdr(assoc 11 LINEENT)))
       (SETQ LINEANGLE (ANGLE PTS PTE))
       (SETQ TEXTEN (ENTSEL "\n选择文字"))
       (redraw (car lineen) 4)
       (IF TEXTEN
          (PROGN
          (setq obj (vlax-ename->vla-object (car texten)))
          (vla-put-rotation obj LINEANGLE)
       )))))
   (progn
       (redraw (car lineen) 3)
       (SETQ LINEENT (ENTGET (CAR LINEEN)))
       (SETQ PTS (cdr(assoc 10 LINEENT)))
       (SETQ PTE (cdr(assoc 11 LINEENT)))
       (SETQ LINEANGLE (ANGLE PTS PTE))
       (SETQ TEXTEN (ENTSEL "\n选择文字"))
       (redraw (car lineen) 4)
       (IF TEXTEN
          (PROGN
          (setq obj (vlax-ename->vla-object (car texten)))
          (vla-put-rotation obj LINEANGLE)
       ))))
(princ));DEFUN
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-5 20:24:33 | 显示全部楼层
其实这个编程实现很简单,即使手改也不慢,主要是看看理论上是否完善
我会用LISP时V-LISP,VBA刚出FOR 14的时候,现在也很少用ACAD了,所以一直对V-LISP没有研究,好像LISP差不多也够用了
“vlax-ename->vla-object “难道V-LISP可以进行指针操作?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-3-6 10:18:55 | 显示全部楼层
首先楼主及朋友的辛勤劳动,其实expresstools里面就有文字和其它对象对齐的命令。
TORIENT
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-8 12:52:09 | 显示全部楼层
嗯,探索中的文字平行就很强啊,还可以实时拖动显示呢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:38 , Processed in 0.474800 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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