MJLM 发表于 2022-7-5 23:24:36

我试图利用您的代码,但似乎无法选择多行文字实体并检索其文字。
在执行代码之后,我使用(ssget(list(cons 0“MTEXT”)(list 10 5 10))来选择位于5,5,10处两行交点上的文本。文本具有(10 5 10)的属性,但它在选择集中为我提供了0个实体。我想这与事实有关,实际上没有实体通过5,5,10点。否则,我如何自动选择它并检索其文本?

ymg3 发表于 2022-7-5 23:27:10

MJML,
 
你为什么要这么做?
 
你有点列表。我创建“多行文字”的唯一原因是为了说明什么是可能的。
 
您肯定应该使用点列表,更具体地说是端点的VL位置
列表中的行。
 

(defun c:test ()
(prompt "\nSelect Network : ")   
(setq s (ssget '((0 . "LINE"))))

(setq pl nil el nil)
(repeat (setq i (sslength s))
    (setq ent (entget (ssname s (setq i (1- i))))
         p1 (cdr (assoc 10 ent))
         pl (if (not (member p1 pl)) (cons p1 pl) pl)
         p2 (cdr (assoc 11 ent))
         pl (if (not (member p2 pl)) (cons p2 pl) pl)
         el (cons (list (vl-position p1 pl) (vl-position p2 pl)
   )
)            

 
在上面的代码片段中,我们构建了另一个列表el,即您的行列表。
 
她看起来像((0 1)(1 2)(2 3)…),你需要做的是扫描列表
重复进行,直到将端点与起点对齐为止。
如有必要。例如:(0 1)(2 1),您反转(2 1)
 
ymg公司

MJLM 发表于 2022-7-5 23:31:19

我不确定我是否完全明白你的意思。不用说,我不是Autolisp专家。我的目的不是要列出所有节点。我的意图正如我在第一篇文章中解释的那样。ascii字符文件,每行具有起始节点、结束节点、管道尺寸、长度和方向。我已经设法把它全部放在一个txt文件,但顺序不能随意。每个启动节点都必须提前给定(在列表中的上面),否则软件会给出错误。请参见下面这个虚构的管道系统
 

 
假设所有管段的公共直径为4”,长度为5ft,并且它们是按0-1、1-3、3-4、4-2、2-1的顺序创建的,正确的写入方法是
 
0 1 4 5U
1 3 4 5E
3.4.5N
4.2.4.5W
2.1.4.5秒
 
如上所述,数字不必是递增模式。除第一行外,所有起始节点都定义为上面某个位置的结束节点,无论在哪里。它可以是1行以上或1000行以上。
 
我已经基本上使用了ssget“X”((0.LINE))选择和所有行的while循环完成了所有这些。因此,我可以检索管道尺寸、长度和方向以及节点。但是,如果我删除第3段至第4段,并由于建筑物中的障碍物而使其如下所示:
 

 
我的例程将根据所有行的创建顺序执行。这意味着3-4之间的五个新部分将被视为最后五个部分。因此,我将得到以下列表:
 
0 1 4 5U
1 3 4 5E
6.2.4.5W
2.1.4.5秒
3.4.1.5N
4.7.1.5E
7.8.4 1.5N
8.5.4 1.5W
5 6 4 2N
 
下面给出了一个错误,因为节点6未在第三行(6 2)上方给出。这就是我试图解决的问题。
 
 
很抱歉,我在重复我自己的话,但在Autolisp中,这些对我来说都是深层次的问题。

ymg3 发表于 2022-7-5 23:36:18

MJLM,
 
现在有点晚了,所以我明天没有详细阅读你的帖子。
 
然而,到目前为止,我的干预是为了让你可以建立一个编号顶点的列表
尊重你的约束。我没有考虑给出方向和/或距离
仅限顶点数。
 
试试这段代码,它通常会在你的网络后面给出一个整数列表。
 
如果你有天线,那不是所有的环本身,每个分支将有一个整数列表。
 

(defun c:test ()
(prompt "\nSelect Network : ")   
(setq s (ssget '((0 . "LINE"))))
; Build Point list               
(setq pl nil)
(repeat (setq i (sslength s))
    (setq ent (entget (ssname s (setq i (1- i))))
         p1 (cdr (assoc 10 ent))
         pl (if (not (vl-position p1 pl)) (cons p1 pl) pl)
         p2 (cdr (assoc 11 ent))
         pl (if (not (vl-position p2 pl)) (cons p2 pl) pl)
    )
)
; Draw Vertex Number
(foreach p pl
   (mk_mtext p (itoa (vl-position p pl)) 5 2 0)
)

; Build the Edge List
(setq el nil)
(repeat (setq i (sslength s))
    (setq ent (entget (ssname s (setq i (1- i))))
         p1 (cdr (assoc 10 ent))
         el (cons (vl-position p1 pl) el)
         p2 (cdr (assoc 11 ent))
         el (cons (vl-position p2 pl) el)            
   )
)               
;(setq pl (vl-sort pl (function (lambda (a b) (< (caddr a) (caddr b)))))        ;; Sort on Z Coordinate   
;      pl (vl-sort pl (function (lambda (a b) (< (cadra) (cadrb)))))        ;; Sort on Y Coordinate   
;      pl (vl-sort pl (function (lambda (a b) (< (car   a) (car   b)))))      ;; Sort on X Coordinate   


(setq xl nil)      
    (print el)
    (while el                                          
      (setq pol (list (cadr el)(car el))      ; We go reverse as we will cons the polyline            
            nxt (car pol)                     ; nxt will be our next edge                              
      el (cddr el)                     ; Remove first two edges from el                        
      )
      (if (not (vl-position nxt el))            ;The previous edge was an end of line                  
    (setq pol (reverse pol)            ;We reverse our Polyline                                 
          nxt (car pol)                  ;and adjust our next edge                              
         )
      )
      
      (while (setq n (vl-position nxt el))        
          (setqel (removenth n el)
                  n (- n (rem n 2))
                pol (cons (nth n el) pol)
          el (removenth n el)
                nxt (car pol)
   )
          
   (if (not (vl-position nxt el))
      (setq pol (reverse pol)
            nxt (car pol)
      )
   )
      )
      
      (setq xl (cons pol xl))
      
    )
    (princ xl)
    (princ)
)   




;;****************************************************************************;
;; mk_mtext                                                                   ;
;; Arguments: p,Insertion Point.                                          ;
;;            s,Text.                                                       ;
;;            j,Justification:                                              ;
;;                1 = Top left; 2 = Top center; 3 = Top right;                ;
;;                4 = Middle left; 5 = Middle center; 6 = Middle right;       ;
;;                7 = Bottom left; 8 = Bottom center; 9 = Bottom right      ;
;;            h,Text Height.                                                ;
;;            r,Rotation.                                                   ;
;;****************************************************************************;

(defun mk_mtext (p s j h r)
(entmakex
   (list (cons 0   "MTEXT")         
         (cons 100 "AcDbEntity")         
         (cons 100 "AcDbMText")   
         (cons 10 p)
         (cons 71 j)
         (cons 40 h)
         (cons 50 r)
         (cons1 s)
   )
)
)

;;----------------------=={ Remove Nth }==--------------------;;
;;                                                            ;;
;;Removes the item at the nth index in a supplied list      ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;Arguments:                                                ;;
;;n - index of item to remove (zero based)                  ;;
;;l - list from which item is to be removed               ;;
;;------------------------------------------------------------;;
;;Returns:List with item at index n removed               ;;
;;------------------------------------------------------------;;

(defun RemoveNth ( n l / i )
   (setq i -1)
   (vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)
)

Hippe013 发表于 2022-7-5 23:36:53

我将研究以下由Lee Mac编写的代码。我相信这会解决问题。
 
;;--------------------=={ Chain Selection }==-----------------;;
;;                                                            ;;
;;Prompts the user to select an object and generates a      ;;
;;selection chain of all objects sharing endpoints with   ;;
;;objects in the accumulative selection.                  ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2012 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;

(defun c:cs ( / en fl in l1 l2 s1 s2 sf vl )
   (setq sf
       (list
          '(-4 . "<OR")
            '(0 . "LINE,ARC")
            '(-4 . "<AND")
                  '(0 . "LWPOLYLINE,SPLINE")
                  '(-4 . "<NOT")
                      '(-4 . "&=")
                      '(70 . 1)
                  '(-4 . "NOT>")
            '(-4 . "AND>")
            '(-4 . "<AND")
                  '(0 . "POLYLINE")
                  '(-4 . "<NOT")
                      '(-4 . "&")
                      '(70 . 89)
                  '(-4 . "NOT>")
                  '(-4 . "AND>")
            '(-4 . "<AND")
                  '(0 . "ELLIPSE")
                  '(-4 . "<OR")
                      '(-4 . "<>")
                      '(41 . 0.0)
                      '(-4 . "<>")
                     (cons 42 (+ pi pi))
                  '(-4 . "OR>")
            '(-4 . "AND>")
          '(-4 . "OR>")
         (if (= 1 (getvar 'cvport))
               (cons 410 (getvar 'ctab))
            '(410 . "Model")
         )
       )
   )
   (if (setq s1 (ssget "_X" sf))
       (if (setq en (ssget "_+.:E:S" sf))
         (progn
               (setq s2 (ssadd)
                     en (ssname en 0)
                     l1 (list (vlax-curve-getstartpoint en) (vlax-curve-getendpoint en))
               )
               (repeat (setq in (sslength s1))
                   (setq en (ssname s1 (setq in (1- in)))
                         vl (cons (list (vlax-curve-getstartpoint en) (vlax-curve-getendpoint en) en) vl)
                   )
               )
               (while
                   (progn
                     (foreach v vl
                           (if (vl-some '(lambda ( p ) (or (equal (car v) p 1e- (equal (cadr v) p 1e-)) l1)
                               (setq s2 (ssadd (caddr v) s2)
                                     l1 (vl-list* (car v) (cadr v) l1)
                                     fl t
                               )
                               (setq l2 (cons v l2))
                           )
                     )
                     fl
                   )
                   (setq vl l2 l2 nil fl nil)
               )
         )
       )
       (princ "\nNo valid objects found.")
   )
   (sssetfirst nil s2)
   (princ)
)
(vl-load-com) (princ)
 
我没有仔细研究这段代码,但我假设节点/行将输入int

ymg3 发表于 2022-7-5 23:42:23

MJML,
 
Then isn't it simply a matter of sorting your file on the first node ?
 
Before creating the file, do you keep it in a list ?
 
How is the diameter of the line kept ?
 
Like I told you, all the code I gave was so you could create
node with a numbering system not going beyond 99999
 
ymg

ymg3 发表于 2022-7-5 23:45:13

The following will number the vertices of your pipe network,
and then create an csv file of it.
 
If you open it in Excel, there will be a blank column for you to enter pipe diameters.
 

(defun c:test () (setq fuzz 0.1)(prompt "\nSelect Network : ")    (setq s (ssget '((0 . "LINE")))) ; Build Point list       (setq pl nil)(repeat (setq i (sslength s))    (setq ent (entget (ssname s (setq i (1- i))))         p1 (cdr (assoc 10 ent))         pl (if (not (positionfuzz p1 pl)) (cons p1 pl) pl)         p2 (cdr (assoc 11 ent))         pl (if (not (positionfuzz p2 pl)) (cons p2 pl) pl)    )); Draw Vertex Number   (foreach p pl   (mk_mtext p (itoa (vl-position p pl)) 5 0.5 0)); Build the Edge List    (setq el nil)(repeat (setq i (sslength s))    (setq ent (entget (ssname s (setq i (1- i))))         p1 (cdr (assoc 10 ent))         el (cons (positionfuzz p1 pl) el)         p2 (cdr (assoc 11 ent))         el (cons (positionfuzz p2 pl) el)               ))    ;(setq pl (vl-sort pl (function (lambda (a b) (< (caddr a) (caddr b)))))        ;; Sort on Z Coordinate       ;      pl (vl-sort pl (function (lambda (a b) (< (cadra) (cadrb)))))        ;; Sort on Y Coordinate       ;      pl (vl-sort pl (function (lambda (a b) (< (car   a) (car   b)))))      ;; Sort on X Coordinate                                                                                                               (setq xl nil)          (print el)    (while el                                                (setq pol (list (cadr el)(car el))      ; We go reverse as we will cons the polyline                         nxt (car pol)                     ; nxt will be our next edge                                    el (cddr el)                     ; Remove first two edges from el                               )      (if (not (positionfuzz nxt el))            ;The previous edge was an end of line                        (setq pol (reverse pol)            ;We reverse our Polyline                                           nxt (car pol)                  ;and adjust our next edge                                           )      )            (while (setq n (positionfuzz nxt el))                    (setqel (removenth n el)                  n (- n (rem n 2))                pol (cons (nth n el) pol)          el (removenth n el)                nxt (car pol)    )             (if (not (positionfuzz nxt el))      (setq pol (reverse pol)            nxt (car pol)      )   )      )            (setq xl (cons pol xl))          )    (setq xl (reverse xl))            ; New Create the file    (setq f (open "C:\\PIPENET.CSV" "a"))      (write-line"From, To,Diam.,Len/Dir"f)    (foreach pol xl    (setqfr (car pol)         p1 (nth fr pl)          pol (cdr pol)    )         (repeat (length pol)       (setq to (car pol)             p2 (nth to pl)            l (distance p1 p2)            v (mapcar '- p2 p1)            a (cond                   ((> (car   v) fuzz)   "E")                   ((< (car   v) (- fuzz)) "W")                   ((> (cadrv) fuzz)   "N")                   ((< (cadrv) (- fuzz)) "S")                   ((> (caddr v) fuzz)   "U")                   ((< (caddr v) (- fuzz)) "D")               )       )       (setq lin (strcat (itoa fr) "," (itoa to) ", ," a (rtos l 2 1)))       (princ (strcat "\n" lin))             (write-line lin f)       (setq fr to             p1 p2            pol (cdr pol)       )      )   )    (close f)          (princ))   ;;****************************************************************************;;; mk_mtext                                                                   ;;; Arguments: p,Insertion Point.                                          ;;;            s,Text.                                                       ;;;            j,Justification:                                              ;;;                1 = Top left; 2 = Top center; 3 = Top right;                ;;;                4 = Middle left; 5 = Middle center; 6 = Middle right;       ;;;                7 = Bottom left; 8 = Bottom center; 9 = Bottom right      ;;;            h,Text Height.                                                ;;;            r,Rotation.                                                   ;;;****************************************************************************;(defun mk_mtext (p s j h r)(entmakex   (list (cons 0   "MTEXT")                  (cons 100 "AcDbEntity")                     (cons 100 "AcDbMText")               (cons 10 p)         (cons 71 j)         (cons 40 h)         (cons 50 r)         (cons1 s)   )));;----------------------=={ Remove Nth }==--------------------;;;;                                                            ;;;;Removes the item at the nth index in a supplied list      ;;;;------------------------------------------------------------;;;;Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;;;------------------------------------------------------------;;;;Arguments:                                                ;;;;n - index of item to remove (zero based)                  ;;;;l - list from which item is to be removed               ;;;;------------------------------------------------------------;;;;Returns:List with item at index n removed               ;;;;------------------------------------------------------------;;(defun RemoveNth ( n l / i )   (setq i -1)   (vl-remove-if '(lambda ( x ) (= (setq i (1+ i)) n)) l)); positionfuzz   by irneb                                    ;(defun positionfuzz (item sequence / p) (setq p -1) (if (vl-some       (function (lambda (a)                   (setq p (1+ p))                   (equal item a fuzz)))       sequence)   p))
 
Ugly code, but seems to work!
 
ymg
pipenet.dwg
PIPENET.CSV
Pipenet.LSP

ymg3 发表于 2022-7-5 23:48:15

Hippe013,
 
For the selection set the CS routine most certainly work.
 
But because we would use the order in selection set s2
as the node number, some of the vertices of the line segments
would need to be reversed.
 
But this could be checked quite easily.
 
Would probably result in a cleaner routine than the one I submitted.
 
ymg

MJLM 发表于 2022-7-5 23:50:42

 
I m not sure what your code does. Is there a file generated or a list?
 
Edit: I think I got it. I m not sure how can I take advantage of it. I need to examine it closely.

MJLM 发表于 2022-7-5 23:54:46

 
Well, unfortunately my pipe networks are often of the grid type, not of the tree type. This means like my picture above I have many closed loops.
页: 1 [2]
查看完整版本: 管网的节点重新编号