sergiu_ciuhnenc 发表于 2022-7-5 17:22:05

多段线长度

向lisp大师寻求帮助:
这是一个包含块的文件,块的属性用于定义钢筋(多段线)的位置、数量和长度;在这个文件中也是我所要求的结果!!(一个表,表示多段线的每个段长度{乘以10}[在excell MROUND函数中])
我是手动完成的第一步,我使用这个lisp:
(vl-load-com)
(defunc:mult-info_po2CSV ( / js file_name cle f_open key_sep str_sep oldimlst_lay-seg lst_id-seg lst_pt lst_length lst_alpha lst_rad nb id
                           n obj ename pr dist_start dist_end pt_start pt_end seg_len seg_bulge rad alpha)
(princ "\nSelectionner les polylignes optimisees.")
(while (null (setq js (ssget '((0 . "LWPOLYLINE")))))
   (princ "\nSelection vide, ou ce ne sont pas des LWPOLYLINE!")
)
(command "_.ddunits"
   (while (not (zerop (getvar "cmdactive")))
   (command pause)
   )
)
(setq file_name (getfiled "Nom du fichier a creer ?: " (strcat (substr(getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 3)) "csv") "csv"37))
(if (null file_name) (exit))
(if (findfile file_name)
   (progn
   (prompt "\nFichier existe deja!")
   (initget "Ajoute Remplace annUler _Add Replace Undo")
   (setq cle
       (getkword "\nDonnees dans fichier? <R>: ")
   )
   (cond
       ((eq cle "Add")
         (setq cle "a")
       )
       ((or (eq cle "Replace") (eq cle ()))
         (setq cle "w")
       )
       (T (exit))
   )
   (setq f_open (open file_name cle))
   )
   (setq f_open (open file_name "w"))
)
(initget "Espace Virgule Point-virgule Tabulation _SPace Comma SEmicolon Tabulation")
(setq key_sep (getkword "\nSeparateur ? <Point-virgule>: "))
(cond
   ((eq key_sep "SPpace") (setq str_sep " "))
   ((eq key_sep "Comma") (setq str_sep ","))
   ((eq key_sep "Tabulation") (setq str_sep "\t"))
   (T (setq str_sep ";"))
)
(setq oldim (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
   lst_lay-seg '()
   lst_id-seg '()
   lst_pt '()
   lst_length '()
   lst_alpha '()
   lst_rad '()
   nb 0
   id 0
)
(repeat (setq n (sslength js))
   (setq
   obj (ssname js (setq n (1- n)))
   ename (vlax-ename->vla-object obj)
   pr -1
   id (1+ id)
   nb 1
   )
   (repeat (fix (vlax-curve-getEndParam ename))
   (setq
       dist_start (vlax-curve-GetDistAtParam ename (setq pr (1+ pr)))
       dist_end (vlax-curve-GetDistAtParam ename (1+ pr))
       pt_start (vlax-curve-GetPointAtParam ename pr)
       pt_end (vlax-curve-GetPointAtParam ename (1+ pr))
       seg_len (- dist_end dist_start)
       seg_bulge (vla-GetBulge ename pr)
       rad (if (zerop seg_bulge) 0.0 (/ seg_len (* 4.0 (atan seg_bulge))))
       alpha (if (zerop seg_bulge) (angle pt_start pt_end) 0.0)
       lst_lay-seg (cons (cdr (assoc 8 (entget obj))) lst_lay-seg)
       lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa nb)) lst_id-seg)
       lst_pt (cons pt_start lst_pt)
       lst_length (cons seg_len lst_length)
       lst_rad (cons (abs rad) lst_rad)
       lst_alpha (cons alpha lst_alpha)
       nb (1+ nb)
   )
   )
   (if (eq (vla-get-closed ename) :vlax-false)
   (setq lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa nb)) lst_id-seg))
   (setq lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa (- nb (fix (vlax-curve-getEndParam ename))))) lst_id-seg))
   )
   (setq
   lst_pt (cons pt_end lst_pt) lst_lay-seg (cons (cdr (assoc 8 (entget obj))) lst_lay-seg)
   lst_length (cons 0.0 lst_length) lst_rad (cons 0.0 lst_rad) lst_alpha (cons 0.0 lst_alpha)
   nb (1+ nb)
   )
)
;(write-line (strcat "Sommaire de " (itoa (sslength js)) " LWPOLYLINES") f_open)
(foreach n
   (reverse
   (mapcar'list
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_lay-seg) (list (strcat "Calque" str_sep)))
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_id-seg) (list (strcat "N°" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'car lst_pt)) (list (strcat "Coordonnees X" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'cadr lst_pt)) (list (strcat "Coordonnees Y" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_length) (list (strcat "Longueurs" str_sep)))
       (append (mapcar '(lambda (x) (strcat (angtos x) str_sep)) lst_alpha) (list (strcat "Angles" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_rad) (list (strcat "Rayons" str_sep)))
   )
   )
   (write-line (apply 'strcat n) f_open)
)
(close f_open)
(setvar "dimzin" oldim)
(prin1)
)
然后我有几个公式,但需要很多时间
如果不可能:我还有一个问题:
在lisp中,我是否也可以在excell中附加导出多段线
目标编号(示例8796078304048)
有没有可能在我的区块中创建一个属性,该属性也可能代表这个ObjId编号,那么对我来说,在excell中将它们关联起来会更容易
 
我知道这可以很快完成,但只有在你的帮助下!!!!!!!!
提前谢谢!!!!!!!!!
多段线长度。图纸

Roy_043 发表于 2022-7-5 17:33:27

为什么不试试_DATAEXTRACTION命令?

sergiu_ciuhnenc 发表于 2022-7-5 17:39:59

我不可能在这种情况下,我已经做好了尝试!!!
我需要上师的帮助!!!

BIGAL 发表于 2022-7-5 17:49:26

第一步,查看将pline链接到块属性的“字段”,特别是“长度”,当您更改pline时,块将更新。只需搜索具有1个名称的块并创建一个表就可以了。此示例跨布局查看,但可以只查看模型空间。也可以将导出添加到excel。
 
Dwgindex。lsp

Roy_043 发表于 2022-7-5 18:04:19

@BIGAL:字段已用于长度。
 
问题是必须分析多段线(折弯数及其半径)以获得所需的输出。使用_DATAEXTRACTION命令确实不可能做到这一点。因此,编写自定义程序似乎是实现这一点的唯一途径。

BIGAL 发表于 2022-7-5 18:10:49

李·麦克有一个很好的Lisp程序特性,你可以适应。
 
“正在使用的字段”我更改了1个条的长度块没有更新?因此发表评论。我选了一个奇怪的吗?

Roy_043 发表于 2022-7-5 18:14:35

也许您忘记了需要\u UPDATEFIELD(或\u REGEN)?

Roy_043 发表于 2022-7-5 18:22:19

在我看来,主要问题是动态块“vcBlockPos\u TIGP”。找出哪个块属于哪个多段线,虽然可行,但这本身就是一项任务。如果插入点与“记号”标记的位置重合,事情就会容易得多。
页: [1]
查看完整版本: 多段线长度