Как да зададем на всички мултилидери rotation angle 0?
Здравейте, наложи ми се да прехвърля обекти от един чертеж в друг, но чертежите са ориентирани под различен ъгъл в чертожната област. Като прехвърля мултилидерите искам да ги селектирам всичките и в Properties да им дам Rotation 0, но няма такава опция. Тъй като не бяха много на един по един им давах командата Rotate, но това е доста трудоемко. Може ли да предложите друго решение?
Здравей, Веселина.
Попринцип може да селектираш всичките мултилидери (снимка 1 позиции 1 и 2) и да ги завъртиш с Rotation (снимка 1 позиция 4) от Properties (снимка 1 позиция 3)
Това завъртане обаче не е спрямо точката на вмъкване, ами спрямо точката "на пречупване" на мултилидера - снимка 2 позиции 1 и 2.
Това ще изправи текста ти така че да стои така че в моделнто пространство при нормално ориентирана система X0Y те да се четат нормално.
Виждам че самия ти текст е доста доста близо ад линията която свързва това което посочваш и самия текст, така че ако приложиш този метод съвета ми е да избереш Landing distance (снимка 3 позиция 1) да е малко по-голяма.
Понякога този вариант върши доста добра работа.
Другият ти вариант е да ползваш този лисп
(defun c:rotmult ()
(prompt "Select Entities to Rotate, <ENTER> for SSX.")
(setq ss (ssget))
(if (not ss) (setq ss (ssx)))
(setq num (sslength ss))
(setq x 0)
(if ss
(if (setq ang (getreal "Enter Rotation Angle: "))
(repeat num
(setq ename (ssname ss x))
(setq elist (entget ename))
(setq pnt (cdr(assoc 10 elist)))
(command "Rotate" ename "" pnt ang)
(setq x (1+ x))
)
)
)
)
и да завърташ N на брой мултилидери под определен ъгъл.
Лиспа се стартира посртедством командата rotmult , ако не си ползвала лисп програмки в тази тема тук:
има обяснение в тази насока.
Идеята е селектираш 10 на брой мултилидера и казваш, след което стартираш програмта и тя съответно те пита на какъв ъгъл спрямо базовата точка искаш да ги завъртиш. Съответно задаваш ъгъла и готово, те са завъртяни.
Тук малкия проблем е че не всички, както каза са завъртяни под един и същи ъгъл и ще трябва да ги завърташ на по отделно.
Този лисп е добре приложим когато имаш даден Layouot, мултилидерите са поставени, така че да се четат лесно в моделното пространство, НО в layout-a дадения Viewport е така завъртян, че се налага и те да се завъртят. И тук лиспа работи перфектно - селектираш мултилидерите за дадения viewport, стартираш , след това избираш ъгъла и вече са завъртяни.
Друг вариант за справяне с проблема е този липс по долу:
;;; ------------------------------------------------------------------------
;;; ZeroRotation.lsp v1.2
;;;
;;; Copyright© 03.09.09
;;; Alan J. Thompson (alanjt)
;;;
;;; Contact: alanjt @ TheSwamp.org, CADTutor.net
;;;
;;; Permission to use, copy, modify, and distribute this software
;;; for any purpose and without fee is hereby granted, provided
;;; that the above copyright notice appears in all copies and
;;; that both that copyright notice and the limited warranty and
;;; restricted rights notice below appear in all supporting
;;; documentation.
;;;
;;; The following program(s) are provided "as is" and with all faults.
;;; Alan J. Thompson DOES NOT warrant that the operation of the program(s)
;;; will be uninterrupted and/or error free.
;;;
;;; Set objects (Multileaders, Text, Mtext, Blocks) with a
;;; rotation of 0 (relative to current UCS).
;;;
;;; Revision History:
;;;
;;; v1.1 (10.23.09) 1. Minor rewrite for speed optimization.
;;; v1.2 (05.31.11) 1. Complete rewrite.
;;;
;;; ------------------------------------------------------------------------
(defun c:zr () (c:ZeroRotation))
(defun c:ZeroRotation (/ *error* AT:UCSAngle ang ss name)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun *error* (msg)
(and *AcadDoc* (vla-endundomark *AcadDoc*))
(if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
(princ (strcat "\nError: " msg))
)
)
(defun AT:UCSAngle (/)
;; Return current UCS angle
;; Alan J. Thompson, 04.06.10
((lambda (x) (atan (cadr x) (car x))) (trans (getvar 'UCSXDIR) 0 (trans '(0. 0. 1.) 1 0 T) T))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN ROUTINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(vl-load-com)
(vla-startundomark
(cond (*AcadDoc*)
((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
)
)
(if (ssget "_:L" '((0 . "INSERT,MTEXT,MULTILEADER,TEXT")))
(progn
(setq ang (AT:UCSAngle))
(vlax-for x (setq ss (vla-get-activeselectionset *AcadDoc*))
(cond ((vl-position (setq name (vla-get-objectname x)) '("AcDbBlockReference" "AcDbText"))
(vla-put-rotation x ang)
)
((eq name "AcDbMText") (vla-put-rotation x 0.))
((and (eq name "AcDbMLeader") (eq (vla-get-contenttype x) 2))
(vla-put-textrotation x 0.)
)
)
)
(vla-delete ss)
)
)
(*error* nil)
(princ)
)
(c:zr)
С него може да направиш така, че да завъртиш селектираните мултилидери в тяхната нула, спрямо координатната система която е в момента, на твоята снимка виждам че е X0Y .
Това са нещата, които мога да препоръчам.
Мерси. Ще пробвам вариантите.