找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 210|回复: 2

lwpoly23dpoly - 3dpoly2lwpoly.lsp

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-14 09:47:10 | 显示全部楼层 |阅读模式
  1. ; transptucs & transptwcs by M.R. (Marko Ribar, d.i.a.)
  2. ; arguments :
  3. ; pt - point to be transformed from WCS to imaginary UCS with transptucs and from imaginary UCS to WCS with transptwcs
  4. ; pt1 - origin of imaginary UCS
  5. ; pt2 - point to define X axis of imaginary UCS (vector pt1-pt2 represents X axis)
  6. ; pt3 - point to define Y axis of imaginary UCS (vector pt1-pt3 represents Y axis)
  7. ; important note : angle between X and Y axises of imaginary UCS must always be 90 degree for correct transformation calculation
  8. ;; Unit Vector - M.R.
  9. ;; Args: v - vector in R^n
  10. (defun unit ( v )
  11.   (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  12. )
  13. ;; Matrix x Vector - Vladimir Nesterovsky
  14. ;; Args: m - nxn matrix, v - vector in R^n
  15. (defun mxv ( m v )
  16.   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  17. )
  18. ;; Vector Cross Product - Lee Mac
  19. ;; Args: u,v - vectors in R^3
  20. (defun v^v ( u v )
  21.   (list
  22.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  23.     (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  24.     (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  25.   )
  26. )
  27. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  28.   (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  29.   (setq ux (unit (mapcar '- p2 p1)))
  30.   (setq uy (unit (mapcar '- p3 p1)))
  31.   
  32.   (mxv (list ux uy uz) (mapcar '- pt p1))
  33. )
  34. (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  35.   (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  36.   (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  37.   (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  38.   (transptucs pt pt1n pt2n pt3n)
  39. )
  40. (defun entmakelwpoly3dpts ( ptlst 70dxfflag / ux uy uz uptlst )
  41.   (setq uz (unit (v^v (mapcar '- (cadr ptlst) (car ptlst)) (mapcar '- (caddr ptlst) (car ptlst)))))
  42.   (if (equal uz '(0.0 0.0 1.0) 1e-8) (setq ux '(1.0 0.0 0.0) uy '(0.0 1.0 0.0)))
  43.   (if (equal uz '(0.0 0.0 -1.0) 1e-8) (setq ux '(-1.0 0.0 0.0) uy '(0.0 1.0 0.0)))
  44.   (if (not (or (equal uz '(0.0 0.0 1.0) 1e-8) (equal uz '(0.0 0.0 -1.0) 1e-8))) (setq ux (unit (v^v '(0.0 0.0 1.0) uz))))
  45.   (if (not uy) (setq uy (unit (v^v uz ux))))
  46.   (setq uptlst (mapcar '(lambda ( p ) (transptucs p '(0.0 0.0 0.0) ux uy)) ptlst))
  47.   (entmake
  48.     (append
  49.       (list
  50.         '(0 . "LWPOLYLINE")
  51.         '(100 . "AcDbEntity")
  52.         '(100 . "AcDbPolyline")
  53.         (cons 90 (length uptlst))
  54.         (cons 70 70dxfflag)
  55.         '(62 . 3)
  56.         (cons 38 (caddar uptlst))
  57.       )
  58.       (mapcar '(lambda ( x ) (list 10 (car x) (cadr x))) uptlst)
  59.       (list (cons 210 uz))
  60.     )
  61.   )
  62.   (princ)
  63. )
  64. (defun c:lwpoly23dpoly ( / lwpol lwdxf lwptl lwel ux uy uz ptlst )
  65.   (setq lwpol (car (entsel "\nPick lwpolyline to convert to 3dpolyline")))
  66.   (if (and lwpol (= (cdr (assoc 0 (setq lwdxf (entget lwpol)))) "LWPOLYLINE"))
  67.     (progn
  68.       (setq lwptl (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) lwdxf))
  69.       (setq lwptl (mapcar '(lambda ( x ) (cdr x)) lwptl))
  70.       (setq lwel (cdr (assoc 38 lwdxf)))
  71.       (setq lwptl (mapcar '(lambda ( x ) (list (car x) (cadr x) lwel)) lwptl))
  72.       (setq uz (cdr (assoc 210 lwdxf)))
  73.       (if (equal uz '(0.0 0.0 1.0) 1e-8) (setq ux '(1.0 0.0 0.0) uy '(0.0 1.0 0.0)))
  74.       (if (equal uz '(0.0 0.0 -1.0) 1e-8) (setq ux '(-1.0 0.0 0.0) uy '(0.0 1.0 0.0)))
  75.       (if (not (or (equal uz '(0.0 0.0 1.0) 1e-8) (equal uz '(0.0 0.0 -1.0) 1e-8))) (setq ux (unit (v^v '(0.0 0.0 1.0) uz))))
  76.       (if (not uy) (setq uy (unit (v^v uz ux))))
  77.       (setq ptlst (mapcar '(lambda ( p ) (transptwcs p '(0.0 0.0 0.0) ux uy)) lwptl))
  78.       (entmake
  79.         (list
  80.           '(0 . "POLYLINE")
  81.           '(100 . "AcDbEntity")
  82.           '(100 . "AcDb3dPolyline")
  83.           '(66 . 1)
  84.           '(62 . 1)
  85.           '(10 0.0 0.0 0.0)
  86.           (cons 70 (+ 8 (cdr (assoc 70 lwdxf))))
  87.           '(210 0.0 0.0 1.0)
  88.         )
  89.       )
  90.       (foreach pt ptlst
  91.         (entmake
  92.           (list
  93.             '(0 . "VERTEX")
  94.             '(100 . "AcDbEntity")
  95.             '(100 . "AcDbVertex")
  96.             '(100 . "AcDb3dPolylineVertex")
  97.             (cons 10 pt)
  98.             '(70 . 32)
  99.           )
  100.         )
  101.       )
  102.       (entmake
  103.         (list
  104.           '(0 . "SEQEND")
  105.           '(100 . "AcDbEntity")
  106.         )
  107.       )
  108.     )
  109.     (prompt "\nNo lwpolyline picked")
  110.   )
  111.   (princ)
  112. )
  113. (defun c:3dpoly2lwpoly ( / pol vert pt ptlst )
  114.   (setq pol (car (entsel "\nPick 3dpolyline to convert to lwpolyline")))
  115.   (if (and pol (= (cdr (assoc 100 (cdr (member (assoc 100 (entget pol)) (entget pol))))) "AcDb3dPolyline"))
  116.     (progn
  117.       (setq vert (entnext pol))
  118.       (while (= (cdr (assoc 0 (entget vert))) "VERTEX")
  119.         (setq pt (cdr (assoc 10 (entget vert))))
  120.         (setq ptlst (cons pt ptlst))
  121.         (setq vert (entnext vert))
  122.       )
  123.       (setq ptlst (reverse ptlst))
  124.       (entmakelwpoly3dpts ptlst (- (cdr (assoc 70 (entget pol))) 8))
  125.     )
  126.     (prompt "\nNo 3dpolyline picked")
  127.   )
  128.   (princ)
  129. )
  130. (prompt "\nDefined functions are c:lwpoly23dpoly and c:3dpoly2lwpoly")
  131. (princ)
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-3-14 09:47:24 | 显示全部楼层
  1. (defun 采用3dlwpolyline  (l col d70 / vl v1 v2 norm z)
  2.   (setq vl (mapcar (function (lambda (a b) (mapcar (function -) a b))) (cdr l) l))
  3.   (setq        v1 (car vl)
  4.         vl (cdr vl))
  5.   (while (and vl (not norm))
  6.     (setq v2 (cadr vl)
  7.           vl (cdr vl))
  8.     (if        (equal (setq norm (v^v v1 v2)) '(0 0 0) 1e-6)
  9.       (setq norm nil)))
  10.   (if norm
  11.     (progn
  12.       (setq z (caddr (trans (car l) 0 norm))
  13.             l (mapcar
  14.                 (function (lambda (a)
  15.                             (reverse (cdr (reverse (trans a 0 norm))))))
  16.                 l))
  17.       (entmakex
  18.         (append
  19.           (list
  20.             (cons 0 "LWPOLYLINE")
  21.             (cons 100 "AcDbEntity")
  22.             (cons 100 "AcDbPolyline")
  23.             (cons 90 (length l))
  24.             (cons 70 d70)
  25.             (cons 38 z))
  26.           (mapcar (function (lambda (a) (cons 10 a))) l)
  27.           (list        (cons 62 col)
  28.                 (cons 210 norm))
  29.           )))
  30.     )
  31.   )
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-3-14 09:47:33 | 显示全部楼层
  1. (defun c:2dpe ()
  2.   (setq sset (ssget '((-4 . "<OR")(0 . "POINT")
  3.                       (0 . "LWPOLYLINE")(-4 . "OR>"))))
  4.   (if sset
  5.     (progn
  6.       (setq itm 0 num (sslength sset))
  7.       (setq fn (getfiled "save to file &#935;,&#933;" "" "txt" 1))
  8.       (if (/= fn nil)
  9.         (progn
  10.           (setq fh (open fn "w"))
  11.           (while (< itm num)
  12.             (setq hnd (ssname sset itm))
  13.             (setq ent (entget hnd))
  14.             (setq obj (cdr (assoc 0 ent)))
  15.             (cond
  16.               ((= obj "POINT")
  17.                 (setq pnt (cdr (assoc 10 ent)))
  18.                 (setq pnt (trans pnt 0 1));;**CAB
  19.                 (princ (strcat (rtos (car pnt) 2 3) ","
  20.                                (rtos (cadr pnt) 2 3)) fh)
  21.                 (princ "\n" fh)
  22.               )
  23.               ((= obj "LWPOLYLINE")
  24.                 (if (= (cdr (assoc 38 ent)) nil)
  25.                   (setq elv 0.0)
  26.                   (setq elv (cdr (assoc 38 ent)))
  27.                 )
  28.                 (foreach rec ent
  29.                   (if (= (car rec) 10)
  30.                     (progn
  31.                       (setq pnt (cdr rec))
  32.                       (setq pnt (trans pnt 0 1));;**CAB
  33.                       (princ (strcat (rtos (car pnt) 2 3) ","
  34.                                      (rtos (cadr pnt) 2 3)) fh)
  35.                       (princ "\n" fh)
  36.                     )
  37.                   )
  38.                 )
  39.               )
  40.               (t nil)
  41.             )
  42.             (setq itm (1+ itm))
  43.           )
  44.           (close fh)
  45.         )
  46.       )
  47.     )
  48.   )
  49.   (princ)
  50. )
  51. (princ)
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 01:59 , Processed in 0.186628 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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