mlb6d9 发表于 2022-7-6 07:31:54

AutoLisp例程帮助

大家好,这是我第一次以会员身份访问该网站。过去我从这个网站上收集了很多有用的信息,为此我感谢大家。
 
我需要一个在任何地方都找不到的lisp例程,并且对lisp还不够熟悉,无法编写一个。所以基本上,我说的是‘救命!’
 
我画了一堆平面图案,其中我画了一堆小弧段和偏移线。偏移距离随我选择的每个连续弧长的长度而变化。现在,我必须选择“List”来获取弧长,然后在请求偏移距离时将其复制并粘贴到命令行中。听起来很简单,但当我处理一大堆事情时,它会变得乏味。我只想在要求偏移距离时能够拾取一条弧,偏移距离与拾取的弧长相同。有道理?
 
非常感谢任何人的帮助!

Lee Mac 发表于 2022-7-6 07:46:22

以下是一个简短而快速的计划:
 
(defun c:arcoff ( / en ex )
   (while
       (progn (setvar 'errno 0) (setq en (car (entsel "\nSelect Arc: ")))
         (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.")
               )
               (   (= 'ename (type en))
                   (if (= "ARC" (cdr (assoc 0 (setq ex (entget en)))))
                     (command "_.offset"
                           (*(cdr (assoc 40 ex))
                               (rem (+ pi pi (- (cdr (assoc 51 ex)) (cdr (assoc 50 ex)))) (+ pi pi))
                           )
                           en "\\" ""
                     )
                     (princ "\nObject is not an Arc.")
                   )
                   t
               )
         )
       )
   )
   (princ)
)

BlackBox 发表于 2022-7-6 07:52:28

欢迎来到CADTutor!
 
**编辑-按照惯例,李打败了我!哈哈,无论如何,至少这表明了一种选择。
 
尝试一下:

(vl-load-com)

(defun c:OFAM () (c:OffsetArcMultiple))
(defun c:OffsetArcMultiple (/ *error* eName acDoc oArc)
(princ "\rOFFSETARCMULTIPLE ")

(defun *error* (msg)
   (if acDoc
   (vla-endundomark acDoc)
   )
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
   )
   (princ)
)

(while (and (/= nil (setq eName (car (entsel "\nSelect arc to offset: "))))
             (= "ARC" (cdr (assoc 0 (entget eName))))
      )
   (progn
   (or
       acDoc
       (not
         (vla-startundomark
         (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
         )
       )
   )
   (vla-offset
       (setq oArc (vlax-ename->vla-object eName))
       (vla-get-arclength oArc)
   )
   (*error* nil)
   )
)
)

mlb6d9 发表于 2022-7-6 08:01:26

谢谢大家!这些对于偏移弧段非常有用!我应该在我的请求中更具体一点-对不起,我实际上是想偏移一条单独的直线,但当被问及偏移距离时,我想为偏移距离选择一个弧段(见附件)

Lee Mac 发表于 2022-7-6 08:09:49

我建议如下:
 
[列表]
[*]偏移
[*]至
[*]
[*]多个
[*]选择弧端点。
[/列表]

mlb6d9 发表于 2022-7-6 08:17:50

谢谢李,我们快到了。当我选择两个端点时,它使用它们之间的直线距离,而不是实际弧长(见附件)。虽然这两个距离很近,但我需要在这些模式中非常精确,十行累积误差可以相加。
 

Lee Mac 发表于 2022-7-6 08:26:27

 
对不起,当然,我不知道我是怎么忽略了这个事实的。
 
尝试快速修改我以前的代码:
 
(defun c:arcoff ( / _select en ex )
   (defun _select ( msg obj / en )
       (while
         (progn (setvar 'errno 0) (setq en (car (entsel msg)))
               (cond
                   (   (= 7 (getvar 'errno))
                     (princ "\nMissed, try again.")
                   )
                   (   (= 'ename (type en))
                     (if (not (wcmatch (cdr (assoc 0 (entget en))) obj))
                           (princ "\nInvalid object selected.")
                     )
                   )
               )
         )
       )
       en
   )
   (if (setq en (_select "\nSelect Object to Offset: " "*LINE"))
       (while (setq ex (_select "\nSelect Arc: " "ARC"))
         (setq ex (entget ex))
         (command "_.offset"
               (*(cdr (assoc 40 ex))
                   (rem (+ pi pi (- (cdr (assoc 51 ex)) (cdr (assoc 50 ex)))) (+ pi pi))
               )
               en "\\" ""
         )
         (setq en (entlast))
       )
   )
   (princ)
)

mlb6d9 发表于 2022-7-6 08:34:58

天哪,就是这样!!!!!谢谢李-它工作得很好,我应该在几年前发布这个。谢谢你们的帮助-我将永远感激!!
 
同时,您是否可以推荐一本专门的书来开始学习AutoLisp?
页: [1]
查看完整版本: AutoLisp例程帮助