对不起,我误导了你们
我附上了一个样本图像,当在等轴测平面(立方体)中椭圆不存在时,多边形应该是什么样子的,它们只是我的向导,让我能够分割和连接节点以形成多边形
是的,这与pBe代码有关。。
我已经试过了,这就是我得到的。
不椭圆不存在
以下是使用变换矩阵映射顶点的示例:
;; 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)
注意,上述示例不是真实投影,因为尺寸保持不变;取消注释代码中注明的比例因子,以获得真实的投影维数。
我怀疑你打开了osnaps,我应该用entmake而不是命令等价物anyhoo。。在按上/右/左的顺序指定直径和插入点后,我们可以合并沼泽中的代码来绘制椭圆和多边形。 @MR;
再次尝试代码。是的,你是对的。它处于等轴测顶部模式,但是如果我更改为左或右,它仍然投影顶部等轴圆。
我喜欢这段代码,因为不需要预先绘制多边形或椭圆
@李;
谢谢李的帮助。惊讶于您如何将2d多边形“旋转”到等轴测视图中。这也帮了大忙!只需要先绘制多边形,然后再将其投影到等距中。。。但还是很酷!
@pBe公司
是的,我打开了OSNAPS
这就解释了结果“甚至不闭合多边形”,我之前建议您修改isoc例程,将多边形的创建一个接一个地包括在内。 以下是我的改进版本,以满足您的需要:
(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。 下面是另一个版本,使用椭圆方程,基于活动等参平面:
[颜色=绿色]------------------=={Isometric Polygon}==----------------;;;;;;允许用户构造投影的正多边形;;;;在主动等轴测平面中;;;;-----------------------------------------------------------------;;;;作者:Lee Mac,版权所有©2012-www.Lee-Mac。通用域名格式;;;;-----------------------------------------------------------------;;(defunc:isopoly(/a b c i l m p r s)(if(nulln)(setqn 6))(while( 如果我注意到的话,你的代码李的目的是什么?。。。我已经更新了我的,以匹配OP的图像,根据你的代码,投影多边形的比例不正确,你还没有包括顶部、左侧、右侧和所有投影的选项(可能我遗漏了什么-你的matrix变体比我的要先进得多,但所有这些都是真的必要的)?
M、 R。
对不起,我忘了包括多边形半径乘数-我已经更新了上述代码,还包括了一个简短的演示。
然而,我要声明的是,原始程序将在每个等轴测平面中构造多边形(基于活动等轴测平面,如上图所示)。
页:
1
[2]