Hari Prashanth 发表于 2022-7-6 09:47:05

节点提取

大家好。。。
Im使用AUTOlisp将二维图形中的坐标提取到excel文件中。
我也附上了一张图供参考。
 
我必须遵循一些关于数字的条件。。。
1、数字必须仅为正方体。
2、坐标提取必须始终从原点开始。ie(0,0)。
3、沿线路前进
4、沿着五角大楼前进
5、在直线与图形相交的同一点或之前的一个节点处结束。
 
这是我遵循的程序。。。
我来画这个图。
2、使用“Divide”命令将其划分为多个节点。
3.加载以下lisp以提取电子表格中的坐标。
 
我附上了LISP编码和示例图。
任何建议都会有帮助。请帮忙。
五角形。图纸
epex。txt文件

Tharwat 发表于 2022-7-6 09:56:27

由于无知,代码被删除!!
 
塔瓦特

Smirnoff 发表于 2022-7-6 10:02:30

这看起来像是学生的家庭作业。你确定你的教授没有参加这个论坛吗?
 
好啊给你一些帮助。但当然不是全部。您不需要使用DIVIDE命令,而是提取直线和多段线(五边形)的顶点(节点)。有示例代码:
 
(defun c:test2(/ cLn cPl lLst pLst)
(if
(and
   (setq cLn(entsel "\nPick line > "))
   (setq cPl(entsel "\nPick pentagon > "))
   ); and
(progn
    (setq cLn(entget(car cLn)) ; get DXF-codes of line
   cPl(entget(car cPl)) ; get DXF-codes of polyline
   lLst(list                ; extract list of ((start pt)(end pt)) for line
       (cdr(assoc 10 cLn))
       (cdr(assoc 11 cLn))
       ); end list
   pLst(mapcar 'cdr        ; extract list ((vertex1)(vertex2)...) for polyline
             (vl-remove-if-not
               '(lambda(i)(= 10(car i)))cPl))
   ); end pLst
    ); end progn
); end if
(list lLst pLst) ; returns ((list 1)(list 2))
); end of c:test2
 
现在你们应该思考,如何对坐标进行排序,以将其以正确的顺序写入文本文件。

Hari Prashanth 发表于 2022-7-6 10:03:47

斯米尔诺夫爵士,
你的代码非常有用。抱歉,我不熟悉autoCAD和autoLISP。这也不是我的研究领域。这是我项目“开发数控机床”的一部分。我从你的评论中理解了大部分内容。谢谢你。当我试图将其保存在TXT文件或CSV文件中时,它显示为空。我附上下面的代码。请帮我解决这个问题。
 
(定义c:测试2(/cLn cPl lLst pLst fn f)
(如果
(和
(setq cLn(entsel“\n点击线>”)
(setq复数(entsel“\n点击五角大楼>”)
); 和
(程序
(setq cLn(entget(car cLn));获取行的DXF代码
cPl(entget(car cPl));获取多段线的DXF代码
lLst(列表;提取行的((起始点)(结束点))列表
(cdr(assoc 10 cLn))
(cdr(assoc 11 cLn))
); 结束列表
pLst(mapcar的cdr;提取列表((顶点1)(顶点2).)对于多段线
(如果没有,则删除vl
'(λ(i)(=10(car i)))复数)
); 结束pLst
); 结束程序
); 如果结束
(列出lLst pLst);返回((列表1)(列表2))
 
 
(if(not(setq fn(getfield“导出到文件”(getvar“dwgprefix”)“csv”1)))
(progn(警报“未选择文件!”)(退出)
)
 
(setq f(open fn“w”))
(princ(strcat(rtos(car llst))”,“(rtos(cadr llst))“\n”)f)
(关闭f)
 
(setq f(open fn“w”))
(princ(strcat(rtos(car plst))”,“(rtos(cadr plst))“\n”)f)
(关闭f)
 
(警报(strcat“完成将点导出到文件:”fn))
); c结束:测试2

pBe 发表于 2022-7-6 10:12:05

 
不确定您希望输出看起来如何,
 

(defun
c:test2(/ cLn cPl lLst pLst fn f)
(if (and
       (setq cLn (entsel "\nPick line > "))
       (setq cPl (entsel "\nPick pentagon > "))) ; and
   (progn
   (setq
       cLn(entget (car cLn))         ; get DXF-codes of line
       cPl(entget (car cPl))         ; get DXF-codes of polyline
       lLst (list                      ; extract list of ((start pt)(end pt)) for line
            (cdr (assoc 10 cLn))
            (cdr (assoc 11 cLn)))    ; end list
       pLst (mapcar
            'cdr                     ; extract list ((vertex1)(vertex2)...) for polyline
            (vl-remove-if-not '(lambda (i) (= 10 (car i))) cPl)))
                                       ; end pLst
   )                                 ; end progn
   )                                 ; end if
(list lLst pLst)                      ; returns ((list 1)(list 2))
(if (not
       (setq
         fn
          (getfiled "Export to file" (getvar "dwgprefix") "csv" 1)))
   (progn (alert "No file selected!") (quit)))
(setq f (open fn "a"))
(write-line
(strcat
   (vl-princ-to-string (car llst))
   ","
   (vl-princ-to-string (cadr llst)))
f)
(write-line
(strcat
   (vl-princ-to-string (car plst))
   ","
   (vl-princ-to-string (cadr plst)))
f)
(close f)
(alert (strcat "Finish export points to file: " fn)))

 
 
结果如下所示
两列
A列
(-122.807 179.928 0.0)
(-4.48415 271.639 0.0)
(118.262 191.53)
(167.471 248.987)
B列
(-122.807 179.928 0.0)
(-4.48415 271.639 0.0)
(118.262 191.53)
(167.471 248.987)
 
我改变了这个
(打开fn“w”)
到这个
(打开fn“a”))
 
w-开放写作。如果文件名不存在,则会创建并打开一个新文件。如果文件名已经存在,
其现有数据被覆盖。传递到打开文件的数据实际上不会写入,直到使用关闭函数关闭文件。
 
虽然
 
a-打开以进行追加。如果文件名不存在,则会创建并打开一个新文件。如果文件名已经存在,
它被打开,指针位于现有数据的末尾,因此写入文件的新数据将附加到现有数据。
 
 
 
希望这有帮助

Hari Prashanth 发表于 2022-7-6 10:16:17

pBE先生,
我了解写入和附加模式。但是代码没有按你说的那样打印出来。它只打印直线的两个端点和五角大楼的一个顶点。请帮忙。

pBe 发表于 2022-7-6 10:21:56

 
OOPS
 
你说得对。
吸引我的是
无论如何,对于多边形的点,您仍然希望它作为两列。。
 

(defun
c:test2(/ cLn cPl lLst pLst fn f)
(if (and
       (setq cLn (entsel "\nPick line > "))
       (setq cPl (entsel "\nPick pentagon > "))) ; and
   (progn
   (setq
       cLn(entget (car cLn))         ; get DXF-codes of line
       cPl(entget (car cPl))         ; get DXF-codes of polyline
       lLst (list                      ; extract list of ((start pt)(end pt)) for line
            (cdr (assoc 10 cLn))
            (cdr (assoc 11 cLn)))    ; end list
       pLst (mapcar
            'cdr                     ; extract list ((vertex1)(vertex2)...) for polyline
            (vl-remove-if-not '(lambda (i) (= 10 (car i))) cPl)))
                                       ; end pLst
   )                                 ; end progn
   )                                 ; end if
(list lLst pLst)                      ; returns ((list 1)(list 2))
(if (not
       (setq
         fn
          (getfiled "Export to file" (getvar "dwgprefix") "csv" 1)))
   (progn (alert "No file selected!") (quit)))
(setq f (open fn "a"))
(write-line
(strcat
(vl-princ-to-string (car llst))
","
(vl-princ-to-string (cadr llst)))
f)
(repeat (/ (length plst) 2)
(write-line
(strcat
(vl-princ-to-string (car plst))
","
(vl-princ-to-string (cadr plst)))
f)
(setq plst (cdr (member (cadr plst) plst )))
)

(close f)
(alert (strcat "Finish export points to file: " fn)))

 
后果
(17.735 225.294 0.0) (80.5574 286.498 0.0)
(186.963 272.374) (139.364 271.642)
(116.199 230.055) (140.631 189.199)
(188.23 189.931) (211.396 231.517)
 
但是如果你想要多边形的单列
 

(defun
c:test2(/ cLn cPl lLst pLst fn f)
(if (and
       (setq cLn (entsel "\nPick line > "))
       (setq cPl (entsel "\nPick pentagon > "))) ; and
   (progn
   (setq
       cLn(entget (car cLn))         ; get DXF-codes of line
       cPl(entget (car cPl))         ; get DXF-codes of polyline
       lLst (list                      ; extract list of ((start pt)(end pt)) for line
            (cdr (assoc 10 cLn))
            (cdr (assoc 11 cLn)))    ; end list
       pLst (mapcar
            'cdr                     ; extract list ((vertex1)(vertex2)...) for polyline
            (vl-remove-if-not '(lambda (i) (= 10 (car i))) cPl)))
                                       ; end pLst
   )                                 ; end progn
   )                                 ; end if
(list lLst pLst)                      ; returns ((list 1)(list 2))
(if (not
       (setq
         fn
          (getfiled "Export to file" (getvar "dwgprefix") "csv" 1)))
   (progn (alert "No file selected!") (quit)))
(setq f (open fn "a"))
(write-line
(strcat
(vl-princ-to-string (car llst))
","
(vl-princ-to-string (cadr llst)))
f)
(repeat (length plst)
(write-line
(vl-princ-to-string (car plst))
f)
(setq plst (cdr plst))
)

(close f)
(alert (strcat "Finish export points to file: " fn)))

 
后果
(17.735 225.294 0.0) (80.5574 286.498 0.0)
(186.963 272.374)
(139.364 271.642)
(116.199 230.055)
(140.631 189.199)
(188.23 189.931)
(211.396 231.517)

Hari Prashanth 发表于 2022-7-6 10:30:00

非常感谢pBe先生,您的代码确实有帮助。
当我从规则形状中提取点时,这是可以的。如果我试着从弧、日蚀段或不规则弧中提取coor呢。。。。所以我必须将弧划分为节点,并按固定间隔进行提取。这就是我在第一个地方一直在问的问题。我怎么能这么做?提前谢谢。

pBe 发表于 2022-7-6 10:35:39

 
你真的不需要用节点分割对象来获得圆弧内的点。
看看这个示例,给定一个恒定的间隔,比如每10个
 

(defun test (val / objts objt_length strt_pt pts valA)
(vl-load-com)
   (setq objts (vlax-ename->vla-object (car (entsel))))
   (setq objt_length (vlax-curve-getDistAtParam objts
                     (vlax-curve-getEndParam objts)))
               (setq strt_pt (vlax-curve-getStartPoint objts))
   (setq pts (list strt_pt) valA val)
(repeat (fix (/ objt_length val))
(setq pts (cons (vlax-curve-getPointAtDist objts val) pts)
                     val (+ val valA))
                  )
   (setq pts (reverse (cons (vlax-curve-getendpoint objts) pts)))
   (foreach pt pts
                  (print pt)
               )
(princ)
)

 
用法:
命令:(测试10)
命令:选择对象:
 
结果:
(242.391 222.255 0.0)
(233.314 226.444 0.0)
(223.933 229.9 0.0)
(214.308 232.602 0.0)
(204.498 234.532 0.0)
(194.567 235.678 0.0)
(184.576 236.033 0.0)
(174.588 235.595 0.0)
(164.666 234.366 0.0)
(154.874 232.355 0.0)
(148.552 230.617 0.0)
 
希望这有帮助
和别叫我先生

Hari Prashanth 发表于 2022-7-6 10:36:24

非常感谢。这解决了我的疑问。很抱歉我以后要问的问题。我可以获得在excel或CSV文件中打印这些值的代码吗。当我尝试时,它只打印两个值。和它可以在一列中提取“x”值,在另一列中提取“y”,而不是在该frm(,)中将其本身提取为点。
 
这是我一直在使用的代码。。。
(定义tst5(val/objts objt\u length strt\u pt pts valA fn f)
(vl load com)
(setq objts(vlax ename->vla对象(car(entsel)))
(setq objt_长度(vlax曲线getDistAtParam objts
(vlax曲线getEndParam objts)))
(setq strt_pt(vlax曲线getStartPoint objts))
(setq pts(list strt\U pt)valA val)
(重复(固定(/objt\u length val))
(setq pts(cons(vlax curve getPointAtDist objts val)pts)
val(+val-valA))
)
(setq pts(反向(cons(vlax curve getendpoint objts)pts)))
 
(setq fn(getfield“导出到文件”(getvar“dwgprefix”)“csv”1)))
(progn(警报“未选择文件!”)(退出)
 
(foreach pt pts
 
(如果(不是
 
(setq f(open fn“a”))
(写入行
(strcat)
(vl princ到字符串(car pt))
","
(vl princ to string(cadr pt)))
f)
 
(关闭f)
(警报(strcat“完成将点导出到文件:”fn)))
页: [1] 2
查看完整版本: 节点提取