VisDak 发表于 2022-7-6 14:30:21

中断然后替换为隐藏l

大家好,
 
请帮助我加快我的工作,我的上级希望我通过叠加单个布局(外部参照文件)来处理多服务布局(MEP组合服务),但他希望通过在交叉线上创建隐藏线来指定交叉服务/线,绘制什么是更高和更低的服务,请查看图像,以便您清楚,
 
风管和管道处于交叉位置,我希望我的管道低于风管工程,我将修剪/打断,然后将修剪线替换为隐藏线,
 
必须在修剪线上替换2条线,1条是隐藏的,另一条是不同层的连续线,这样,如果他们只需要管线图,我将关闭隐藏线并再次更改为连续线,
 
有没有可能有一个Lsp自动打断线并替换为2线(连续和隐藏不同层),然后连续线将自动关闭,这样只有隐藏线将被表示,如果你有像我需要的Lsp,请帮助我,
 
感谢大家,

Commandobill 发表于 2022-7-6 14:42:01

干得好
 
(defun c:bline ( / )
(setq obj (entsel "Select object: "))
(setq pt2 (getpoint "Specify second break point: "))
(setq pt1 (cadr obj))
(command "break" pt1 pt2)
(command "line" pt1 pt2 "")
(setq l1name (vlax-ename->vla-object (entlast)))
(vla-put-linetype l1name "HIDDEN")
(vla-put-layer l1name "C-ANNO-NOTE") ;<----INSERT NEW LAYER
(command "line" pt1 pt2 "")
(setq l2name (vlax-ename->vla-object (entlast)))
(vla-put-linetype l2name "CONTINUOUS")
(vla-put-layer l2name "C-ANNO-TEXT") ;<-----INSERT NEW LAYER
(princ)
)

Lee Mac 发表于 2022-7-6 14:45:40

当然,我等了一整天才编写代码,看看是否还有其他人会这么做,但是。。。李对你的代码有一些看法。
 

(defun c:brk(/ *error* vlst ovar cEnt pt1 pt2 cObj bPts nlin)
(vl-load-com)

(defun *error*(msg)
   (if ovar
   (mapcar 'setvar vlst ovar))
   (if (not (member msg '("Function cancelled" "quit / exit abort")))
   (princ (strcat "\n<< Error: " msg " >>"))
   (princ "<< Function Cancelled >>"))
   (princ))

(if (not (tblsearch "LTYPE" "HIDDEN"))
   (vla-load "HIDDEN" "acad.lin"))

(setq doc (vla-get-ActiveDocument
             (vlax-get-Acad-Object))
       spc (if (zerop (vla-get-activespace doc))
             (if (= (vla-get-mspace doc) :vlax-true)
               (vla-get-modelspace doc)
               (vla-get-paperspace doc))
             (vla-get-modelspace doc)))

(setq vlst '("CMDECHO" "OSMODE")
       ovar (mapcar 'getvar vlst))
(setvar "CMDECHO" 0)
(if (and (setq cEnt (entsel "\nSelect Line: "))
          (member (cdr (assoc 0 (entget (car cEnt))))
                  '("LINE" "POLYLINE" "LWPOLYLINE")))
   (if (and (setq pt1 (getpoint "\nSelect First Point: "))
            (setq pt2 (getpoint "\nSelect Second Point: ")))
   (progn
       (setvar "OSMODE" 0)
       (setq cObj (vlax-ename->vla-object (car cEnt)))
       (setq bPts
            (mapcar
                (function
                  (lambda (x)
                  (vlax-curve-getClosestPointto cObj x)))
                      (list pt1 pt2)))
       (command "_break" cEnt "_F" (car bPts) (cadr bPts))
       (setq nlin
         (vla-addline spc
         (vlax-3D-point (car bPts))
             (vlax-3D-point (cadr bPts))))
       (if (tblsearch "LTYPE" "HIDDEN")
         (vla-put-linetype nlin "HIDDEN")
         (princ "\n<!> Hidden Linetype Could not be Found <!>")))
   (princ "\n<!> Points not Selected <!>"))
   (princ "\n<!> Incorrect Line Selection <!>"))
(mapcar 'setvar vlst ovar)
(princ))

 
现在它形成了一条隐藏线。
 
我真的很喜欢这个想法,检查它是否是一条折线。
 
(if (not (tblsearch "LTYPE" "HIDDEN"))
   (vla-load (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object)))"HIDDEN" "ACAD.LIN"))
 
我不明白你为什么在。。。break会自动执行此操作。
 
他还要求在两个不同的层上画两条线,一个是隐藏的,一个是连续的。
我希望你不要认为我在攻击你。就我个人而言,我从你写的代码中学到了很多。我只是觉得你需要一些批评。

Commandobill 发表于 2022-7-6 14:55:43

谢谢比尔,我会接受所有批评的
 
 
好的,这是一个小学生的错误,我只是匆匆忙忙(我已经加载了“隐藏”线型,所以它不会导致我在测试时注意到的错误……但这不是借口。。
 
 
 
谢谢
 
 
我没有AutoCAD的经验,不知道break会自动使用getClosestPointto,所以我只是确保它们是直线上的点
 
至于层次和其他行-待定,我没有完全阅读的要求太仔细,我只是看了图片

Lee Mac 发表于 2022-7-6 15:03:39

好的,随着线型错误的改变。。。
 
(为了安全起见,我还是想把getClosestPointto放在那里)
 

(setvar "OSMODE" 0)
       (setq cObj (vlax-ename->vla-object (car cEnt)))
       (setq bPts
            (mapcar
                (function
                  (lambda (x)
                  (vlax-curve-getClosestPointto cObj x)))
                      (list pt1 pt2)))

Lee Mac 发表于 2022-7-6 15:04:11

谢谢李和Commandobill
 
你的两个Lisp程序都很有帮助,很抱歉由于工作繁忙,回复很晚
 
再次感谢朋友们
 
干杯

VisDak 发表于 2022-7-6 15:12:56

看这里
DHline v.1.0!!;-)

VVA 发表于 2022-7-6 15:22:35

 
哦,哇。。。这太狡猾了!太不可思议了!

Freerefill 发表于 2022-7-6 15:28:49

太棒了,就像Lisp程序:震惊:

VisDak 发表于 2022-7-6 15:36:30

页: [1]
查看完整版本: 中断然后替换为隐藏l