
- ;;对region物件无效
- (defun c:UCS_Z(/ e)
- (if (setq e (car (entsel)))
- (progn
- (command "._ucs" "n" "ob" e)
- (command "._ucs" "n" "za" "" '(0 -1 0))
- )
- )
- (princ)
- )
- 对region物件有效
- (defun c:UCS_Z(/ e)
- (if (setq e (cadr (entsel)))
- (progn
- (command "._ucs" "n" "ob" e)
- (command "._ucs" "n" "za" "" '(0 -1 0))
- )
- )
- (princ)
- )
- 对region对象有效,是因为有点选动作,但如在选集中,
- 则对region无效,连双元表也对其无效(可能我对双元表用错了)。
- (defun C:UCS_Z (/ E)
- (setq E (ssget '((0 . "region"))))
- (command "._ucs" "n" "ob" (list (ssname E 0) '(0 0 0)))
- )
- 设 REGION对Z轴旋转30度,再對X轴旋转30度
- (不在世界坐标 OR Z不等于0 ),即不能用vla-get-centroid取得质心,
- 但当对REGION作对象UCS则问题解决。
- 问题待解:
- 如何在选集中对REGION作对象UCS???
- ;;在质心上画点
- (defun C:CENTROID (/ HOLDOSMODE SS N CENT KEY KEY1 KEY2 TMP)
- (defun DO_IT (ENT)
- (setq
- CENT
- (vlax-get (vlax-ename->vla-object ENT) "centroid")
- )
- (prompt (strcat "\n矩心= " (vl-princ-to-string CENT)))
- (command "_.POINT" CENT)
- )
- (vl-load-com)
- (setq HOLDOSMODE (getvar "osmode"))
- (while (= SS NIL)
- (prompt "\n选择对象: ")
- (setq
- SS (ssget
- '((0 . "region,lwpolyline,polyline,circle,ellipse,spline"))
- )
- )
- )
- (setq N 0)
- (setvar "osmode" 0)
- (setvar "PDMODE" 35)
- (repeat (sslength SS)
- (setq KEY1 (ssname SS N))
- (setq KEY2 (vlax-ename->vla-object KEY1))
- (setq KEY (cdr (assoc 0 (entget KEY1))))
- (cond
- ((= KEY "REGION")
- ;;(M_UCS KEY2)
- (DO_IT KEY1)
- (command "_.UCS" "P")
- )
- ((or (= KEY "CIRCLE")
- (= KEY "ELLIPSE")
- (and
- (or (= KEY "LWPOLYLINE")
- (= KEY "POLYLINE")
- (= KEY "SPLINE")
- )
- (= :vlax-true (vla-get-closed KEY2))
- )
- )
- (command "_.COPY" KEY1 "" "0,0" "@")
- (command "_.REGION" (entlast) "")
- (setq TMP (entlast))
- ;;(M_UCS (vlax-ename->vla-object TMP))
- (DO_IT TMP)
- (command "_.ERASE" TMP "")
- )
- )
- (setq N (1+ N))
- )
- (setvar "osmode" HOLDOSMODE)
- (princ)
- )
- (princ)
- ;;因求不出Z轴旋转或NEWUCS精度不足,故失败
- ;;-------------------------------------------------------
- (defun M_UCS (ENT)
- (setq UCS (XDRX_MATRIX_GETECS
- (vlax-safearray->list
- (vlax-variant-value (vla-get-normal ENT))
- )
- )
- )
- (setq NEWUCS (vla-add (vla-get-usercoordinatesystems
- (setq DOC (vla-get-activedocument
- (vlax-get-acad-object)
- )
- )
- )
- (vlax-3d-point '(0 0 0))
- (vlax-3d-point (nth 0 UCS))
- (vlax-3d-point (nth 1 UCS))
- "New_UCS"
- )
- )
- (vla-put-activeucs DOC NEWUCS)
- )
- (defun XDRX_MATRIX_GETECS (NORMAL / ECS_X ECS_Y)
- (setq NORMAL (xdrx_vector_normalize NORMAL))
- (if (and
- (< (abs (car NORMAL)) (/ 1 64.0))
- (< (abs (cadr NORMAL)) (/ 1 64.0))
- )
- (setq ECS_X (xdrx_vector_normalize
- (xdrx_vector_crossproduct
- '(0 1 0)
- NORMAL
- )
- )
- )
- (setq ECS_X (xdrx_vector_normalize
- (xdrx_vector_crossproduct
- '(0 0 1)
- NORMAL
- )
- )
- )
- )
- (setq ECS_Y (xdrx_vector_crossproduct NORMAL ECS_X))
- (list ECS_X (xdrx_vector_normalize ECS_Y) NORMAL)
- )
- ;;--------------------------------------------------------
|