有点复杂的autolisp编程问题

有点复杂的autolisp编程问题,第1张

;;QQ:406868625

(defun c:addMidLines(/ oldOsmode ss count num midPointList angList ang pmid ssPer ang0 p0 p01 p1 p2 tmpStr)

(setq oldOsmode (getvar "osmode"))

(setvar "osmode" 0)

(prompt "请选择圆:")

(setq ss (ssget '((0 "CIRCLE"))))

(setq count 1

num (sslength ss)

)

(setq midPointList '())

(setq angList '())

(repeat (1- num)

(setq p1 (cdr (assoc 10 (entget (ssname ss (1- count)))))

p2 (cdr (assoc 10 (entget (ssname ss count))))

)

(setq ang (angle p1 p2)

pmid (polar p1 ang ( 05 (distance p1 p2)))

)

(setq midPointList (append midPointList (list pmid)))

(setq angList (append angList (list ang)))

(command "line" p1 p2 nil)

(setq count (1+ count))

)

(setq ssPer (ssadd))

(setq len ( 05 10))

(setq count 0)

(setq num (length midPointList))

(repeat num

(setq p0 (nth count midPointList))

(setq ang0 (nth count angList))

(setq p1 (polar p0 (+ ang0 ( 05 pi)) len)

p2 (polar p0 (- ang0 ( 05 pi)) len)

)

(command "line" p1 p2 nil)

(ssadd (entlast) ssper)

(setq count (1+ count))

)

(setq tmpStr (getstring "按任意键继续 "))

(command "erase" ssper "")

(setq dis0 20)

(setq count 0)

(repeat num

(setq p0 (nth count midPointList))

(setq ang0 (nth count angList))

(setq p01 (polar p0 ang0 dis0))

(setq p1 (polar p01 (+ ang0 ( 05 pi)) len)

p2 (polar p01 (- ang0 ( 05 pi)) len)

)

(command "line" p1 p2 nil)

(setq p01 (polar p0 (+ ang0 pi) dis0))

(setq p1 (polar p01 (+ ang0 ( 05 pi)) len)

p2 (polar p01 (- ang0 ( 05 pi)) len)

)

(command "line" p1 p2 nil)

(setq count (1+ count))

)

(setvar "osmode" oldOsmode)

(princ)

)

用 command 命令即可 下面是我随手输入的 你自己调试一下

(defun c:cla()

(setvar "cmdecho" 0)

(setq SS (+ 1 2))

(command "text" (getpoint "point:") "" "" ss )

(princ)

)

entsel

提示用户通过指定一个点来选择单个对象(图元)

(entsel [msg])

参数

msg

用于提示用户的字符串。如果省略该参数,则提示信息为“选择对象”。

返回值

表,其中第一个元素是用户所选对象的图元名,第二个元素是用户选择对象时指定的拾取点的坐标值(用当前 UCS 表示)。

entsel 函数返回的拾取点不一定在所选对象上,它返回的是选择对象时十字光标的位置。拾取点和对象之间的关系依赖于拾取框的尺寸和当前缩放比例。

示例

下面的 AutoCAD 命令说明了 entsel 函数的使用方法及其返回的表:

命令: line

起点: 1,1

下一点: 6,6

下一点: ENTER

命令: (setq e (entsel "请选择一个对象: "))

请选择一个对象: 3,3

(<图元名: 60000014> (30 30 00))

有时候在 *** 作一个对象时,不但需要选中一个对象,同时还需要知道指定的点。例如在 AutoCAD 中的 Object Snap 以及 BREAK、TRIM 和 EXTEND 命令中就是这样。entsel 使得 AutoLISP 程序可以实现这种 *** 作。它通过选取点的方式来选取单个对象。除非在函数中作特别申明,否则 initget 函数将忽略当前 Osnap 设置。entsel 函数支持它前面通过调用 initget 函数设置的关键字。

要添加选择点才可以。

(defun c:WQ10 ( / #os1 aa l1 l2 p1 p2 p3 p4 p5 p6 p7 p8)

(setq #os1 (getvar "osmode"))

(setq p1 (getpoint "\n请选择基点"))

(if (/= p1 nil)

 (progn

  (setq p2 (polar p1 pi 208)

        p3 (polar p1 pi 288)

        p4 (polar p2 ( 05 pi) 420)

        p5 (polar p4 0 418)

        p6 (polar p1 0 208)

        p7 (polar p1 0 288)

        p8 (polar p1 ( pi 05) 90)

   )

   (setvar "osmode" 0);关闭捕捉才可以绘制图元,否则会不正确

   (command "LINE" p2 p4 "")

   (setq L1 (entlast))

   (command "LINE" p6 p5 "")

   (setq L2 (entlast))

   (command "ARC" p7 p8 p3)

   (setq AA (entlast))

   (command "fillet" "r" 50)

   (command "fillet" (list AA p7) (list L2 p5))

   (entdel AA)

   (command "ARC" p7 p8 p3)

   (setq AA (entlast))

   (command "fillet" (list AA p3) (list L1 p4));加圆角的时候有选择点

   (entdel AA);删除已经倒圆角的弧,在高版本里面圆弧会断线这个改变的圆弧要删除

   (command "ARC" p7 p8 p3);绘制圆弧

   (setvar "osmode" #os1)

  )

 )

 (prin1)

);在高版本里面,直线也会变短达到你要绘制的要求。

程序绘制好以后如下:

换个思路,轮廓线不删除,代码如下:

(defun c:111 ( / ptb ptb1 sel1 x)

(if (setq sel1 (entsel))

(progn

(setq sel1 (car sel1))

(setq ptb (mapcar 'cdr (vl-remove-if '(lambda(x)(/= (car x) 10)) (entget sel1))))

(if (setq ptb1 (ssget "_cp" ptb));如果选中对象

(vl-catch-all-apply 'ssdel (list sel1 ptb1));选择集里面排除轮廓线

)

(if (ssname ptb1 0);如果选择集里面还有其他对象

(command "ERASE" ptb1 "");删除

)

)

)

(princ)

)

以上就是关于有点复杂的autolisp编程问题全部的内容,包括:有点复杂的autolisp编程问题、如何用AutoLisp编写自动标注里程桩程序、请教Autolisp高手:关于entsel函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9693580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存