Как да зададем на всички мултилидери rotation angle 0?

AutoCAD Формула AutoCAD

Здравейте, наложи ми се да прехвърля обекти от един чертеж в друг, но чертежите са ориентирани под различен ъгъл в чертожната област. Като прехвърля мултилидерите искам да ги селектирам всичките и в Properties да им дам Rotation 0, но няма такава опция. Тъй като не бяха много на един по един им давах командата Rotate, но това е доста трудоемко. Може ли да предложите друго решение?

Здравей, Веселина.

Попринцип може да селектираш всичките мултилидери (снимка 1 позиции 1 и 2) и да ги завъртиш с Rotation (снимка 1 позиция 4) от Properties (снимка 1 позиция 3)

Снимка_1

Това завъртане обаче не е спрямо точката на вмъкване, ами спрямо точката "на пречупване" на мултилидера - снимка 2 позиции 1 и 2.

Снимка_2

Това ще изправи текста ти така че да стои така че в моделнто пространство при нормално ориентирана система X0Y те да се четат нормално.

Виждам че самия ти текст е доста доста близо ад линията която свързва това което посочваш и самия текст, така че ако приложиш този метод съвета ми е да избереш Landing distance (снимка 3 позиция 1) да е малко по-голяма.

Снимка_3

Понякога този вариант върши доста добра работа.


Другият ти вариант е да ползваш този лисп

(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 , ако не си ползвала лисп програмки в тази тема тук:

Lisp_programmme

има обяснение в тази насока.

Идеята е селектираш 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 .


Това са нещата, които мога да препоръчам.

Мерси. Ще пробвам вариантите.


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация