明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: flyfox1047

[源码] 获取多段线顶点XY座标,并写入到表格

    [复制链接]
发表于 2024-9-8 21:34:16 | 显示全部楼层

顶一个,楼主
发表于 2024-11-26 23:06:53 | 显示全部楼层
楼主的技术与胸怀都是
向你致敬
回复 支持 反对

使用道具 举报

发表于 2024-11-27 10:10:14 | 显示全部楼层
不错不错,支持一下
回复 支持 反对

使用道具 举报

发表于 2025-2-5 22:22:31 | 显示全部楼层
(defun c:zn (/ aCen cAng cCen cPl cRad cReg fDr it lCnt lLst mSp pCen pT1 pT2 ptLst R tHt tLst vlaPl vlaTab vLst cTxt oldCol nPl clFlg actDoc tPt1 tPt2 cAng tiPt oSnp *error* prefix)
  (vl-load-com)
  (defun Extract_DXF_Values (Ent Code)
    (mapcar 'cdr (vl-remove-if-not '(lambda (a) (= (car a) Code)) (entget Ent))))
  (defun *error* (msg)
    (setvar "CMDECHO" 1)
    (if oSnp (setvar "OSMODE" oSnp))
    (if mSp (vla-EndUndoMark actDoc))
    (princ))
  (if (and (setq cPl (entsel)) (= "LWPOLYLINE" (car (Extract_DXF_Values (car cPl) 0))))
    (progn
      (setq tHt (getreal "\n请输入文字高度: "))
      (if (not tHt) (setq tHt (getvar "TEXTSIZE")))
      (setq prefix (getstring T "\n请输入点号前缀(可选): "))
      (setq vlaPl (vlax-ename->vla-object (car cPl))
            ptLst (mapcar 'append (setq vLst (Extract_DXF_Values (car cPl) 10)) (mapcar 'list (Extract_DXF_Values (car cPl) 42)))
            r 2 lCnt 0
            tLst '((1 0 "点号") (1 1 "X") (1 2 "Y"))
            actDoc (vla-get-ActiveDocument (vlax-get-acad-object))
            mSp (vla-get-ModelSpace actDoc))
      (vla-StartUndoMark actDoc)
      (setvar "CMDECHO" 0)
      (setq oSnp (getvar "OSMODE"))
      (foreach vert ptLst
        (setq vert (trans vert 1 0)
              tLst (append tLst (list (list r 0 (strcat prefix (itoa (1+ lCnt)))) (list r 1 (rtos (cadr vert) 2 3)) (list r 2 (rtos (car vert) 2 3)))))
        (if (and (/= 0.0 (last vert)) (setq pt1 (vlax-curve-GetPointAtParam vlaPl lCnt)) (setq pt2 (vlax-curve-GetPointAtParam vlaPl (1+ lCnt))))
          (progn
            (setq r (1+ r)
                  cRad (abs (/ (distance pt1 pt2) (* 2 (sin (/ (* 4 (atan (abs (last vert)))) 2)))))
                  aCen (vlax-curve-GetPointAtParam vlaPl (+ 0.5 lCnt))
                  fDr (vlax-curve-getFirstDeriv vlaPl (vlax-curve-getParamAtPoint vlaPl aCen))
                  pCen (trans (polar aCen (-(if (minusp (last vert)) pi (* 2 pi)) (atan (/ (car fDr) (cadr fDr)))) cRad) 1 0)
                  tLst (append tLst (list (list r 0 "center") (list r 1 (rtos (cadr pCen) 2 3)) (list r 2 (rtos (car pCen) 2 3)) (list r 3 (rtos cRad 2 3)))))
          )
        )
        (setq r (1+ r) lCnt (1+ lCnt))
      )
      (setq vlaTab (vla-AddTable mSp (vlax-3D-point '(0 0 0)) (+ 1 (/ (length tLst) 3)) 3 (* 1.6 tHt) (* 13 tHt)))
      (foreach i tLst
        (vl-catch-all-apply 'vla-SetText (cons vlaTab i))
        (vla-SetCellTextHeight vlaTab (car i) (cadr i) tHt)
        (vla-SetCellAlignment vlaTab (car i) (cadr i) acMiddleCenter)
      )
      (vla-put-VertCellMargin vlaTab (* 0.35 tHt))
      (vla-put-Height vlaTab (* 1.2 (/ (length tLst) 3)))
      (vla-SetColumnWidth vlaTab 0 (* 5 tHt))
      (vla-DeleteRows vlaTab 0 1)
      (princ "\n<<< 请在绘图区选择表格放置位置 >>> ")
      (command "_.copybase" (trans '(0 0 0) 1 0) (entlast) "")
      (command "_.erase" (entlast) "")
      (command "_.pasteclip" pause)
      (if (= :vlax-true (vla-get-Closed vlaPl))
        (progn
          (setq nPl (vla-Copy vlaPl))
          (command "_.region" (entlast) "")
          (setq cCen (vlax-get (setq cReg (vlax-ename->vla-object (entlast))) 'Centroid))
          (vla-Delete cReg)
          (setq clFlg T)
        )
      )
      (setq lCnt 0)
      (foreach v vLst
        (if clFlg
          (setq cAng (angle cCen (trans v 1 0)) iPt (polar v cAng (* 0.6 tHt)))
          (progn
            (setq tPt1 (vlax-curve-GetPointAtParam vlaPl (- lCnt 0.0000001)) tPt2 (vlax-curve-GetPointAtParam vlaPl (+ lCnt 0.0000001)) cAng (angle tPt1 (if tPt2 tPt2 (polar tPt1 (* 0.5 pi) 0.0000001))) iPt (polar v (+ (* pi 0.5) (if (minusp cAng) cAng (- cAng))) (* 0.6 tHt)))
          )
        )
        (setvar "OSMODE" 0)
        (setq cTxt (vla-AddText mSp (strcat prefix (itoa (1+ lCnt))) (vlax-3d-point iPt) tHt) tiPt (vla-get-InsertionPoint cTxt) lCnt (1+ lCnt))
        (vla-put-Alignment cTxt 10)
        (vla-put-TextAlignmentPoint cTxt tiPt)
        (setq oldCol (getvar "CECOLOR"))
        (setvar "CECOLOR" "1")
        (command "_.circle" v (/ tHt 15))
        (setvar "CECOLOR" oldCol)
      )
      (setvar "OSMODE" oSnp)
      (setvar "CMDECHO" 1)
      (vla-EndUndoMark actDoc)
    )
    (princ "\n<!> 选择的对象不是多段线!程序退出。 <!> ")
  )
  (gc)
  (princ)
)
回复 支持 反对

使用道具 举报

发表于 2025-2-5 22:23:56 | 显示全部楼层
自己参照大神代码调整一下
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
好东西  学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-23 00:55 , Processed in 0.170533 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表