管网的节点重新编号
你好Autolisp world我是一名工程师,经常处理液压问题。我有一个水力计算软件,它在一个通用文本编辑器中以增量方式接受数字作为节点。然而,每个节点在连接2个管道(例如通过弯头)或3个管道(例如三通)的空间中是唯一的。这些数字是任意的。例如
1 2 4 12U
2.3.4.5N
3.4.5
4.5.4.5秒
5.2.4.5W
上面创建了一个5英尺的正方形,由4“管道组成,由4”和12英尺高的立管馈电。每行的前两个数字表示开始和结束节点。下一个是管道的标称直径,最后一个是长度及其方向。
到目前为止,我已经制作了一个autolisp例程,在txt文件中,使用while循环和计数器,在Autocad中绘制的每一行中写入如上所示的行,精确地表示管网。我使用句柄10和11检索起点和终点(x,y,z)的坐标,并连接数字,以便使它们在空间中唯一。当一条管道在空间起点50,35,12和终点70,35,12中具有坐标时,形成的起点和终点的编号分别为503512和703512。所以我的程序写了一行
503512 703512 4 20E
该管道的起始节点为503512,结束节点为703512,尺寸为4”,向东延伸20英尺(假设正y为北)。对管网中的所有管线重复此操作。
我的问题开始了。我的液压软件不接受大于99999的节点号。这意味着我需要将我所有的点以xxyyzz格式翻译成小于99999的内容。不管它是什么,但它必须在1到99999之间。它还必须是唯一的,因为在该节点上可能连接其他管道。
我一直没能做到。我需要一个函数,我想它会给我这些唯一的转换值,或者类似于重新编号例程的东西,但我想不出来。也许我的整个方法都不正确。任何帮助都将不胜感激。 经过研究,我的方法确实是错的。我通过在任何线交点上创建一个点来解决这个问题,从而在每个节点上都有一个控制柄。这给了我想要的。
我还有一个问题,希望有人能提供一些帮助。我已经做了线,然后我意识到我需要创建更多来修改我的管道系统。问题是,这些新行总是获得下一个可用句柄(5“…”)最后,我在文件中输入了所有数据。这使得系统崩溃,因为这些新节点(来自修改)应该在其他节点之前进行适当的再生,而不是在最后。
那么,是否可以更改图形数据库中句柄的顺序,以便所有句柄都得到正确的顺序重新编号? 我对你的例行公事很感兴趣。
考虑使用扩展数据,而不是繁琐的DXF组码5[句柄] 是的,我也试过了。问题是我需要找到一种方法,在每条管线上导入基于几何体而不是任何其他句柄的扩展数据,以避免(5.handle)创建的序列。这意味着我需要做一个while循环,以便它能够理解每一行的x、y、z开始和结束,并包括现有行之间的新行的扩展数据。这将使每一行都有一个基于几何体而不是基于autocad创建的内部序列的增量数。在T形连接上,由于公共节点上有三条线,因此可能很棘手。
不幸的是,到目前为止我还没有做到。我会继续找的。如果有人有主意,我很乐意听。 我想我会考虑使用数据扩展函数。与GIS中使用的相同。然后,您可以自定义想要的字段或属性,并将其导出到用excel打开的dbx文件中。acmaplisp。chm是一种很好的资源。正如pBe所说,我将避免使用手柄。
我希望我能理解你在寻找什么。
当做
Hippe013 理解。我的问题不是数据(句柄或扩展数据)。我的问题是,我实际上是通过一个while循环扫描一个完整的互连线网络(代表管网)。该循环的顺序始终是线创建的顺序(始终基于句柄)。不幸的是,我无法改变这一点,这就是造成我问题的原因。如果我在管网的起点和终点之间编辑一个管段,那么我在txt文件中为该管段获取的线最终会出现,网络将崩溃,因为序列中缺少该管道。
换句话说,这都是关于控制while循环对实体起作用的顺序。
顺便问一下,是否可以将数据而不是剪贴板或txt文件粘贴到excel中?你提到了上面的事情,但我不确定我是否明白。 你为什么不公布你的日常活动,这样我们就可以帮助你了? 这不是例行公事。这是我的其他软件如何处理节点顺序的问题。列表中新管段的每个起始节点必须至少在其上方指定一次作为结束节点。如果不是这样,它就会被压碎。问题是,在Autocad中,我需要在不同位置对设计进行更改。这些变化带来了新的管道,因此在所有其他管道之后创建了新的管段,无论几何结构是否放置在整个管网之间并与其他管段连接。它们总是位于while循环为所有行(ssget“X”((0.LINE))生成的列表的底部,因为它们出现的时间较晚。但另一个软件报告了错误,因为这些节点尚未定义,因此可以绘制绘制并连接到这些最新节点的旧线段。
我不确定它是否被理解。我发现唯一的解决方法是在同一个图形中进行修改(沿网络运行)后,按几何方式剪切和粘贴旧段。这样,这些较旧的段将采用新的控制柄,因此它们显示为在新添加的段之后创建的。这样做是可行的,但在更改/添加之前或之后绘制的内容应该非常小心。这不是最好的,但至少效果很好。 MJLM,
如果从每条线的端点绘制点列表,则不允许点重复。
任何给定端点列表中的位置都是节点数。
ymg公司 MJLM,
一段代码来告诉你我的意思。
请注意,排序不是必需的,但可能很有用。
(defun c:test ()
(prompt "\nSelect Network : ")
(setq s (ssget '((0 . "LINE"))))
(setq pl nil)
(repeat (setq i (sslength s))
(setq ent (entget (ssname s (setq i (1- i))))
p (cdr (assoc 10 ent))
pl (if (not (member p pl)) (cons p pl) pl)
p (cdr (assoc 11 ent))
pl (if (not (member p pl)) (cons p pl) pl)
)
)
(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
)
(foreach p pl
(mk_mtext p (itoa (vl-position p pl)) 5 2 0)
)
(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)
)
)
)
页:
[1]
2