nod684 发表于 2022-7-6 08:06:25

 
 
 
 
对不起,我误导了你们
 
我附上了一个样本图像,当在等轴测平面(立方体)中椭圆不存在时,多边形应该是什么样子的,它们只是我的向导,让我能够分割和连接节点以形成多边形

nod684 发表于 2022-7-6 08:09:04

 
是的,这与pBe代码有关。。
 
我已经试过了,这就是我得到的。
 
不椭圆不存在

Lee Mac 发表于 2022-7-6 08:09:43

以下是使用变换矩阵映射顶点的示例:
 

;; Isometric Projection Example-Lee Mac

(defun c:iso ( / c e l m p q v )
   (initget 1 "Top Right Left")
   (setq m
       (mxs
         (cdr
               (assoc (getkword "\nSpecify Isometric Projection Plane : ")
                   (list
                     (list "Top"   (list (sqrt 3.0) (sqrt 3.0)) '(-1.0 1.0))
                     (list "Right" (list (sqrt 3.0)   0.0   ) '( 1.0 2.0))
                     (list "Left"(list (sqrt 3.0)   0.0   ) '(-1.0 2.0))
                   )
               )
         )
         0.5 ;(/ (sqrt 6.0) 6.0) ;; True projection
       )
   )
   (while
       (progn (setvar 'errno 0) (setq e (car (entsel "\nSelect LWPolyline: ")))
         (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.")
               )
               (   (= 'ename (type e))
                   (if (/= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
                     (princ "\nInvalid object selected.")
                   )
               )
         )
       )
   )
   (if e
       (progn
         (setq e (entget e)
               l (LM:massoc 10 e)
               q (length l)
               c (mapcar '/ (apply 'mapcar (cons '+ l)) (list q q))
               v (mapcar '- c (mxv m c))
         )
         (entmake
               (append
                   (list
                      '(0 . "LWPOLYLINE")
                      '(100 . "AcDbEntity")
                      '(100 . "AcDbPolyline")
                     (assoc 90 e)
                     (assoc 70 e)
                     (assoc 38 e)
                   )
                   (mapcar '(lambda ( p ) (cons 10 (mapcar '+ (mxv m p) v))) l)
                   (list (assoc 210 e))
               )
         )
       )
   )
   (princ)
)

;; MAssoc-Lee Mac
;; Returns all associations of a key in an association list

(defun LM:MAssoc ( key lst / item )
   (if (setq item (assoc key lst))
       (cons (cdr item) (LM:MAssoc key (cdr (member item lst))))
   )
)

;; Matrix x Vector-Vladimir Nesterovsky
;; Args: m - nxn matrix, v - vector in R^n

(defun mxv ( m v )
   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
)

;; Matrix x Scalar - Lee Mac 2010
;; Args: m - nxn matrix, n - real scalar

(defun mxs ( m s )
   (mapcar '(lambda ( r ) (mapcar '(lambda ( n ) (* n s)) r)) m)
)

(princ)

 
注意,上述示例不是真实投影,因为尺寸保持不变;取消注释代码中注明的比例因子,以获得真实的投影维数。

pBe 发表于 2022-7-6 08:13:56

 
我怀疑你打开了osnaps,我应该用entmake而不是命令等价物anyhoo。。在按上/右/左的顺序指定直径和插入点后,我们可以合并沼泽中的代码来绘制椭圆和多边形。

nod684 发表于 2022-7-6 08:19:02

@MR;
再次尝试代码。是的,你是对的。它处于等轴测顶部模式,但是如果我更改为左或右,它仍然投影顶部等轴圆。
我喜欢这段代码,因为不需要预先绘制多边形或椭圆
 
@李;
谢谢李的帮助。惊讶于您如何将2d多边形“旋转”到等轴测视图中。这也帮了大忙!只需要先绘制多边形,然后再将其投影到等距中。。。但还是很酷!
 
@pBe公司
是的,我打开了OSNAPS

pBe 发表于 2022-7-6 08:19:08

 
这就解释了结果“甚至不闭合多边形”,我之前建议您修改isoc例程,将多边形的创建一个接一个地包括在内。

marko_ribar 发表于 2022-7-6 08:23:14

以下是我的改进版本,以满足您的需要:
 

(defun transptisotop (pt)
(list (+ (car (polar (list 0.0 0.0 0.0) (/ pi 6.0) (car pt)))
       (car (polar (list 0.0 0.0 0.0) (* 5.0 (/ pi 6.0)) (cadr pt))) )

       (+ (cadr (polar (list 0.0 0.0 0.0) (/ pi 6.0) (car pt)))
       (cadr (polar (list 0.0 0.0 0.0) (* 5.0 (/ pi 6.0)) (cadr pt))) )

       0.0
)
)

(defun transptisoleft (pt)
(list (+ (car (polar (list 0.0 0.0 0.0) (- (/ pi 6.0)) (car pt)))
       (car (polar (list 0.0 0.0 0.0) (/ pi 2.0) (cadr pt))) )

       (+ (cadr (polar (list 0.0 0.0 0.0) (- (/ pi 6.0)) (car pt)))
       (cadr (polar (list 0.0 0.0 0.0) (/ pi 2.0) (cadr pt))) )

       0.0
)
)

(defun transptisoright (pt)
(list (+ (car (polar (list 0.0 0.0 0.0) (- (* 5.0 (/ pi 6.0))) (car pt)))
       (car (polar (list 0.0 0.0 0.0) (/ pi 2.0) (cadr pt))) )

       (+ (cadr (polar (list 0.0 0.0 0.0) (- (* 5.0 (/ pi 6.0))) (car pt)))
       (cadr (polar (list 0.0 0.0 0.0) (/ pi 2.0) (cadr pt))) )

       0.0
)
)

(defun isotop (vertlst squarelst ptci1 ptci2)
(setq vertlstn (mapcar '(lambda (p) (transptisotop p)) vertlst))
(setq isopoltop (entmakex
                   (append
                     (list
                     '(0 . "LWPOLYLINE")
                     '(100 . "AcDbEntity")
                     '(100 . "AcDbPolyline")
                        (cons 90 (length vertlstn))
                     '(70 . 1)
                     )
                     (mapcar '(lambda (x) (cons 10 x)) vertlstn)
                     (list (list 210 0.0 0.0 1.0))
                   )
               )
)
(setq sqarelstn (mapcar '(lambda (p) (transptisotop p)) squarelst))
(setq isosquaretop (entmakex
                      (append
                        (list
                        '(0 . "LWPOLYLINE")
                        '(100 . "AcDbEntity")
                        '(100 . "AcDbPolyline")
                           (cons 90 (length sqarelstn))
                        '(70 . 1)
                        )
                        (mapcar '(lambda (x) (cons 10 x)) sqarelstn)
                        (list (list 210 0.0 0.0 1.0))
                      )
                  )
)
(setq pta (transptisotop ptci1))
(setq ptb (transptisotop ptci2))
(setq ra (distance '(0.0 0.0 0.0) pta))
(setq rb (distance '(0.0 0.0 0.0) ptb))
(setq isocircletop (entmakex
                      (list
                        '(0 . "ELLIPSE")
                        '(100 . "AcDbEntity")
                        '(100 . "AcDbEllipse")
                        (cons 10 (list 0.0 0.0 0.0))
                        (cons 11 pta)
                        (list 210 0.0 0.0 1.0)
                        (cons 40 (/ rb ra))
                        '(41 . 0.0)
                        (cons 42 (* 2.0 pi))
                      )
                  )
)
)

(defun isoleft (vertlst squarelst ptci1 ptci2)
(setq vertlstn (mapcar '(lambda (p) (transptisoleft p)) vertlst))
(setq isopolleft (entmakex
                  (append
                      (list
                        '(0 . "LWPOLYLINE")
                        '(100 . "AcDbEntity")
                        '(100 . "AcDbPolyline")
                         (cons 90 (length vertlstn))
                        '(70 . 1)
                      )
                      (mapcar '(lambda (x) (cons 10 x)) vertlstn)
                      (list (list 210 0.0 0.0 1.0))
                  )
                  )
)
(setq sqarelstn (mapcar '(lambda (p) (transptisoleft p)) squarelst))
(setq isosquareleft (entmakex
                     (append
                         (list
                           '(0 . "LWPOLYLINE")
                           '(100 . "AcDbEntity")
                           '(100 . "AcDbPolyline")
                            (cons 90 (length sqarelstn))
                           '(70 . 1)
                         )
                         (mapcar '(lambda (x) (cons 10 x)) sqarelstn)
                         (list (list 210 0.0 0.0 1.0))
                     )
                     )
)
(setq pta (transptisoleft ptci1))
(setq ptb (transptisoleft ptci2))
(setq ra (distance '(0.0 0.0 0.0) pta))
(setq rb (distance '(0.0 0.0 0.0) ptb))
(setq isocircleleft (entmakex
                     (list
                         '(0 . "ELLIPSE")
                         '(100 . "AcDbEntity")
                         '(100 . "AcDbEllipse")
                         (cons 10 (list 0.0 0.0 0.0))
                         (cons 11 pta)
                         (list 210 0.0 0.0 1.0)
                         (cons 40 (/ rb ra))
                         '(41 . 0.0)
                         (cons 42 (* 2.0 pi))
                     )
                     )
)
)

(defun isoright (vertlst squarelst ptci1 ptci2)
(setq vertlstn (mapcar '(lambda (p) (transptisoright p)) vertlst))
(setq isopolright (entmakex
                     (append
                     (list
                         '(0 . "LWPOLYLINE")
                         '(100 . "AcDbEntity")
                         '(100 . "AcDbPolyline")
                        (cons 90 (length vertlstn))
                         '(70 . 1)
                     )
                     (mapcar '(lambda (x) (cons 10 x)) vertlstn)
                     (list (list 210 0.0 0.0 1.0))
                     )
                   )
)
(setq sqarelstn (mapcar '(lambda (p) (transptisoright p)) squarelst))
(setq isosquareright (entmakex
                        (append
                        (list
                            '(0 . "LWPOLYLINE")
                            '(100 . "AcDbEntity")
                            '(100 . "AcDbPolyline")
                           (cons 90 (length sqarelstn))
                            '(70 . 1)
                        )
                        (mapcar '(lambda (x) (cons 10 x)) sqarelstn)
                        (list (list 210 0.0 0.0 1.0))
                        )
                      )
)
(setq pta (transptisoright ptci1))
(setq ptb (transptisoright ptci2))
(setq ra (distance '(0.0 0.0 0.0) pta))
(setq rb (distance '(0.0 0.0 0.0) ptb))
(setq isocircleright (entmakex
                        (list
                        '(0 . "ELLIPSE")
                        '(100 . "AcDbEntity")
                        '(100 . "AcDbEllipse")
                        (cons 10 (list 0.0 0.0 0.0))
                        (cons 11 pta)
                        (list 210 0.0 0.0 1.0)
                        (cons 40 (/ rb ra))
                        '(41 . 0.0)
                        (cons 42 (* 2.0 pi))
                        )
                      )
)
)

(defun c:isopolygon (/ pol vertlst rad ptci1 ptci2 squarelst ch)
(vl-cmdf "_.ucs" "w")
(vl-cmdf "_.plan" "")
(vl-cmdf "_.zoom" "c" "0,0,0" "")
(vl-cmdf "_.polygon" pause "0,0,0" "I" pause)
(setq pol (entlast))
(mapcar '(lambda (x) (if (= (car x) 10) (setq vertlst (cons (cdr x) vertlst)))) (entget pol))
(setq vertlst (reverse vertlst))
(setq rad (distance '(0.0 0.0 0.0) (car vertlst)))
(setq ptci1 (polar '(0.0 0.0 0.0) (- (/ pi 4.0)) rad))
(setq ptci2 (polar '(0.0 0.0 0.0) (/ pi 4.0) rad))
(setq squarelst (list (list (- rad) (- rad) 0.0) (list rad (- rad) 0.0) (list rad rad 0.0) (list (- rad) rad 0.0)))
(initget "Top Left Right All")
(setq ch (getkword "\nEnter Top/Left/Right <All> : "))
(cond ((or (eq ch "All") (null ch))
      (isotop vertlst squarelst ptci1 ptci2)
      (setq sstop (ssadd))
      (ssadd isopoltop sstop)
      (ssadd isosquaretop sstop)
      (ssadd isocircletop sstop)
      (vl-cmdf "_.move" sstop "" (cdr (assoc 10 (entget isosquaretop))) '(0.0 0.0 0.0) )
      (isoleft vertlst squarelst ptci1 ptci2)
      (setq ssleft (ssadd))
      (ssadd isopolleft ssleft)
      (ssadd isosquareleft ssleft)
      (ssadd isocircleleft ssleft)
      (vl-cmdf "_.move" ssleft "" '(0.0 0.0 0.0) (cdr (assoc 10 (entget isosquareleft))) )
      (isoright vertlst squarelst ptci1 ptci2)
      (setq ssright (ssadd))
      (ssadd isopolright ssright)
      (ssadd isosquareright ssright)
      (ssadd isocircleright ssright)
      (vl-cmdf "_.move" ssright "" '(0.0 0.0 0.0) (cdr (assoc 10 (entget isosquareright))) )
       )
       ((eq ch "Top")
      (isotop vertlst squarelst ptci1 ptci2)
       )
       ((eq ch "Left")
      (isoleft vertlst squarelst ptci1 ptci2)
       )
       ((eq ch "Right")
      (isoright vertlst squarelst ptci1 ptci2)
       )
)
(entdel pol)
(vl-cmdf "_.ucs" "p")
(princ)
)
M.R。

Lee Mac 发表于 2022-7-6 08:26:41

下面是另一个版本,使用椭圆方程,基于活动等参平面:
 
[颜色=绿色]------------------=={Isometric Polygon}==----------------;;;;;;允许用户构造投影的正多边形;;;;在主动等轴测平面中;;;;-----------------------------------------------------------------;;;;作者:Lee Mac,版权所有©2012-www.Lee-Mac。通用域名格式;;;;-----------------------------------------------------------------;;(defunc:isopoly(/a b c i l m p r s)(if(nulln)(setqn 6))(while(

marko_ribar 发表于 2022-7-6 08:30:32

如果我注意到的话,你的代码李的目的是什么?。。。我已经更新了我的,以匹配OP的图像,根据你的代码,投影多边形的比例不正确,你还没有包括顶部、左侧、右侧和所有投影的选项(可能我遗漏了什么-你的matrix变体比我的要先进得多,但所有这些都是真的必要的)?
 
M、 R。

Lee Mac 发表于 2022-7-6 08:32:16

 
对不起,我忘了包括多边形半径乘数-我已经更新了上述代码,还包括了一个简短的演示。
 
然而,我要声明的是,原始程序将在每个等轴测平面中构造多边形(基于活动等轴测平面,如上图所示)。
页: 1 [2]
查看完整版本: 等距多边形