昨天问了一个问题,版大给出了程序,可以解决问题,但具体到我的程序,多了一步输入。
我的程序的目的是选择直线上的某一点,在该点上插入一个图块(这里为了代码在别的机器上兼容,改为写一行文字,道理是一样的),图块的角度按照直线的斜率。
通过entsel选直线,getpoint获得插入点,需要输入两次,工作中对于大量的操作来说,每次减少一次操作是很有意义的,所以我想了个讨巧的办法,用一个10x10的窗通过SSGET来同时获得插入点和插入直线,对于建筑图来说,一般不会在10x10那么小的范围里有2个对象,基本能够实现。
当对象是直线或者多段线的情况,我已经解决了,但当对象是在块中的某一直线的话,我现在用了一个笨办法,通过再输入一个点来获得,结果就是多了一次输入过程。
下面是我的程序,对于(= btype "INSERT"),请问怎样取出直线的端点坐标。
 -
- (defun c:rb(/ oldos #98 btype p0 p01 p1 pt1 pt2 pt3 pt param1 param2 ent)
- (setvar "cmdecho" 0)
- (command "undo" "c" "")
- (command "undo" "be")
- (setq oldos (getvar "osmode"))
- (setvar "osmode" 512)
- (setq p0 (getpoint "\n 点取线上插入点..."))
- (setq p01 (list (+ (nth 0 p0) 10) (+ (nth 1 p0) 10)))
- (setvar "osmode" 0)
- (SETQ #98 (SSGET "c" p0 p01))
- (setq #98 (entget (ssname #98 0)))
- (SETQ btype(CDR (ASSOC 0 #98)))
- (if (= btype "LINE")
- (SETQ pt1(CDR (ASSOC 10 #98))
- pt2(CDR (ASSOC 11 #98)))
- )
- (if (= btype "LWPOLYLINE")
- (setq ent (CDR (ASSOC -1 #98))
- pt (vlax-curve-getclosestpointto ent p0)
- param1 (fix (vlax-curve-getparamatpoint ent pt))
- param2 (1+ param1)
- pt1 (vlax-curve-getpointatparam ent param1)
- pt2 (vlax-curve-getpointatparam ent param2))
- )
- (if (and (/= btype "LINE") (/= btype "LWPOLYLINE"))
- (progn
- (setvar "osmode" 512)
- (alert "对不起,请再选择所在墙面上任一点!")
- (setq pt3 (getpoint "\n 选择所在墙面上任一点..."))
- (SETQ pt1 p0
- pt2 pt3 )
- );end-progn
- )
- (setq AN (ANGLE pt2 pt1))
- (SETQ AN (ANGTOS AN 0 2))
- ;(COMMAND "INSERT" "gy" P0 "1" "1" an)
- (command "text" "s" "standard" "c" p0 400 an "123")
- (setvar "osmode" oldos)
- (command "ucs" "")
- (command "undo" "e")
- (setvar "cmdecho" 1)
- (princ)
- )
-
谢谢
|