| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp'ик-2 бы...

Lisp'ик-2 бы...

Ответ
Поиск в этой теме
Непрочитано 26.03.2005, 18:17 #1
Lisp'ик-2 бы...
Vova
 
Engineer
 
New-York
Регистрация: 05.09.2003
Сообщений: 10,288

Тема "Lisp'ик бы" уже была. Поэтому появилась цифра 2.
Проблема такая. Здание Г-образной формы. То крыло, которое в натуре расположено вертикально, для удобства на листе располагается горизонтально. Соответственно, в модели меняется UCS так, чтобы ось Х шла вдоль вертикальной стороны крыла, то есть вверх и затем применяется команда Plan, чтобы на экране вертикальное крыло также встало горизонтально. Далее, рисуем, ставим размеры. Далее надо скопировать кое-что на другой этаж, то есть в другой файл, где такие-же настройки. И вот при переносе вертикальные размеры выворачиваются ногами не в ту сторону. Приходится их перерисовывать. Можно ли сделать программу, которая возвращала бы
размеры обратно? А еще лучше, чтобы при переносе через Wblock объекты и их размеры сразу вставали в другом файле правильно. (в смысле размеры объектов). А в общем случае, угол может быть и не 90 град.
Просмотров: 5508
 
Непрочитано 26.03.2005, 21:28
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Vova привет. Попробуй, програмка устанавливает вектор нормали всех размеров в (0.0 0.0 1.0), т. е. так как будто они начерчены в при "обычном" положении осей. Если это прокатывает, то возможны вариации на тему "нормального" вида размеров в любых видах.
Код:
[Выделить все]
(defun c:drot(/ dimSet dimList norArr norVar)
  (if
     (setq dimSet(ssget "_X" '((0 . "DIMENSION"))))
     (progn
       (setq dimList(mapcar 'vlax-ename->vla-object 
                      (vl-remove-if 'listp 
                        (mapcar 'cadr(ssnamex dimSet))))
	     norArr(vlax-make-safearray vlax-vbDouble '(0 . 2))
	     norVar(vlax-make-variant
		     (vlax-safearray-fill norArr '(0.0 0.0 1.0)))
       ); end setq
       (foreach dim dimList
	 (vla-put-Normal dim norVar)
	 ); end foreach
       ); end progn
  ); end if
  (princ)
  ); end of drot
{Smirnoff} вне форума  
 
Непрочитано 26.03.2005, 22:59
#3
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Вот усовешенствованный вариант. У прошлого были проблеммы с диаметрами, радиусами и угловыми размерами. К сожалению проблемма с угловыми размерами осталась- после обработки, они показывают внешний угол вместо внутреннего, однако привязки остаются и можно просто потянуть мышкой. Добавлены Text и MText для выносок.
Код:
[Выделить все]
(defun c:drot(/ objSet objList norArr norVar oldTp newminPt minPt dimIns)
  (vl-load-com)
  (setq	norArr(vlax-make-safearray vlax-vbDouble '(0 . 2))
	norVar(vlax-make-variant
		 (vlax-safearray-fill norArr '(0.0 0.0 1.0)))
       ); end setq
  (if
     (setq objSet(ssget "_X" '((0 . "DIMENSION"))))
     (progn
       (setq objList(mapcar 'vlax-ename->vla-object 
                      (vl-remove-if 'listp 
                        (mapcar 'cadr(ssnamex objSet)))))
       (foreach   dim objList
	 (setq oldTp(vla-get-TextPosition dim))
	 (vla-put-Normal dim norVar)
	 (vla-put-TextPosition dim oldTp)
	 ); end foreach
       ); end progn
  ); end if
  (if
    (setq objSet(ssget "_X" '((-4 . "<OR")(0 . "MTEXT")
			      (0 . "TEXT")(-4 . "OR>"))))
    (progn
       (setq objList(mapcar 'vlax-ename->vla-object 
                      (vl-remove-if 'listp 
                        (mapcar 'cadr(ssnamex objSet)))))
          (foreach tex objList
	    (vla-getBoundingBox tex 'minPt 'maxPt)
	    (vla-put-Normal tex norVar)
	    (vla-getBoundingBox tex 'newminPt 'newmaxPt)
	    (vla-move tex newminPt minPt)
	    ); end foreach
      ); end progn
    ); end if
  (princ)
  ); end of drot
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 27.03.2005, 18:34
#4
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Fantomas и тем, программерам, кто попробует решить проблему> После команды Plan вертикальные размеры приобретают статус Rotated Dimensions, может быть поэтому они не поддаются изменению? Я пробовал вводить прогу Fantomas до вставки, после, в файле с которого размер копируется, в файле-приемнике, но все остается как было. Прикрепил для пробы файлик Drawing1. Здесь текущая UCS, по которой сделан Plan, названа 1. Сделайте файлу Saveas как Drawing2 и попробуйте перенести туда нарисованное. Увидите, что вертикальный (на экране) размер вывернется. Надо его без перерисовки вернуть назад.
[ATTACH]1111934077.dwg[/ATTACH]
Vova вне форума  
 
Автор темы   Непрочитано 27.03.2005, 18:47
#5
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


У меня есть лисп, который переворачивает вертикальные размеры головой наоборот при Ucs World. K сожалению, файл зашифрован, но он работает от команды FD. Такой путь, если бы лисп работал в моем случае, меня бы устроил
Код:
[Выделить все]
AutoCAD PROTECTED LISP file
zA№HЦбЉEОФдзѓTшыМў~є[ЖюЭПчЉ5u‡jєeҐ%j*$0vћRЙі~™UГгўeҐ-zЂi·OъњTНх?XЯСѓs‰3LэЫШЕгў7Nу‰3Eш…b§.0jпдтЃj№Bч†bЄ&F·T“p’Lм*>j*{ґ_ЯСѓCгҐ.0	gЅWЋSз†-y‘KшћQНьђDыЧжЈ$fабђXГу‚hЈgЉ|Ћt›^УЙ™+mгсТ”(&}Ф™:=Aц„hјYа¤%/?sѓ
LэќNтЕил‘gохВҐc?PйЊ_т¬	Vе†$aИ№Kр”G®>FКЩъҐWгззжну©m…MЦд™w§-sмУњ]ЯШГв*2Dь– 2nµ
z‡" %,-4HФэ©sОьРЃ+|Ш™Q‚4Pђ.uКеўlсйЩ›SГб¶&EГШчЈLЬр¬yЪ•%bіw‚`айЅpЊ9ZЗкЎ2DрЏ?VЙэЏlЅ>,1iтЃj№Bч†bЄuћR„oІhрГ®tБЄ_·GэћIгз·6DнµYЧЫ—m»*,6EЈnЦ¤aЎ,6
3NґF±C®>B¤aЈ4YСѓ7Nд*rН»Uо”dЌUщє::V…7Fь‹~’F¬{Є;0,r*]љoјCеї_УТЦЩ“Eпяћ^ХЖиїqЌuД«~цдАЁ[їvДЎ~Ь‘@д»W†l«$'-zБіGц‰:]љ~Ё&uЪ›'gДЂ( 2qЊ/W§F¤:VЭ›OъХѓtќYБчП·wЂrДјIІQЊ.mиевег¦>qЃ#sЦЌcўlш‰wЗ¦G‡.9Lх„mъЌЧҐBЌ)X№zЭ±jЭ“#fдЄ1 (1QНшС– 8+vШџ!pФЂ7gжЅ	}ќU*H™:}ТЦИеєUТБЈo*.>jфБа®3
!rДЎZжнвхЕ»^•>Iб¬:Tќ6L±Cю™){ьриШёYЧБч‚j°Aъ‘
5cП¶gЗ†$BЌlшЩГх‚kµKґ5NРиЃGЗВҐfм–OфЊzЂ!/+%>\ЪРЃbдїeёcҐ*8PДа¬<_ЧАпсБЄ|тмрляЏmі	qЛќ.t?Cп±  b?_шЅ24,oр*@*lшҐ2Mє3*jђhќYАЎNјt‡/,-4F¬dкьу
Vova вне форума  
 
Непрочитано 27.03.2005, 20:22
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


С лиспом сложновато... Делов том что свойства размеров Rotation и TextRotation всегда после создания имеют значение 0 в независимости от угла разворота рамера. Тут чистейший "глюк". Но я нашел способ :!: Скопируйте все в третий файл и все надписи развернутся как надо
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 27.03.2005, 20:55
#7
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


У меня большой файл, как первый, из которого беру копию некоторых объектов с размерами, так и второй, куда копию кладу. В обоих UCS не мировая и одинаковая и оба развернуты командой Plan одинаково. Ты предлагаешь это делать через промежуточный файл? Попробовал, не помогает. Кстати, Properties всегда показывает статус линейных размеров, что они Rorated, даже при норм. UCS.
Vova вне форума  
 
Непрочитано 27.03.2005, 21:25
#8
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Если я правильно понял проблему то может помочь такой код:
Код:
[Выделить все]
(defun c:dim-text-orient (/ a b c ob n)
    (and
        (if (setq a (getorient "\nSpecify angle <0>: "))
            t
            (setq a 0)
        ) ;_ end of if
        (setq n 0
              b (ssget '((0 . "DIMENSION")))
        ) ;_ end of setq
        (while (setq ob (ssname b n))
            (setq n  (1+ n)
                  ob (entget ob)
            ) ;_ end of setq
            (entmod
                (if (setq c (assoc 51 ob))
                    (subst (cons 51 a) c ob)
                    (append ob (cons 51 a))
                ) ;_ end of if
            ) ;_ end of entmod
        ) ;_ end of while
    ) ;_ end of and
    (princ)
) ;_ end of defun
Применять к "неправильным" размерам. С углом ориентации поэксперементируйте, я навскидку не помню как обстоит дело с его вводом в пользовательских системах координат. Однако кажется при вводе с клавиатуры (в градусах) значение определяется относительно МСК.
AY вне форума  
 
Непрочитано 27.03.2005, 21:38
#9
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


А у меня получается(см. файл). Сначала делаю как вы сказали, потом файл с "неправильным" размером копирую в третий и тогда рамеры разворачиваются как надо.
Цитата:
Кстати, Properties всегда показывает статус линейных размеров, что они Rorated, даже при норм. UCS.
Не понимаю... Rotated Dimension и Aligned Dimension два разных примитива, и переходить один в другой не могут.
[ATTACH]1111945095.dwg[/ATTACH]
{Smirnoff} вне форума  
 
Непрочитано 27.03.2005, 21:51
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>AY Вот где проявляется разница, между Auto и Visual. Я сделал то же самое на Visual:
Код:
[Выделить все]
(defun c:dimrot(/ objSet dimList)
  (vl-load-com)
    (if
     (setq objSet(ssget '((0 . "DIMENSION"))))
      (progn
	(setq dimList(mapcar 'vlax-ename->vla-object 
          (vl-remove-if 'listp 
            (mapcar 'cadr(ssnamex objSet)))))
	(foreach dim dimList
         (vla-put-TextRotation dim 3.14159)
	  ); end foreach
	); end progn
     ); end if
     (princ)
     ); end of dimr
И получил премерзопакостнейший результат, со смещением текста и укроченной размерной линией...
{Smirnoff} вне форума  
 
Непрочитано 27.03.2005, 22:54
#11
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Fantomas
Кажется всетаки не тоже самое. Насколько я понимаю vla-put-TextRotation меняет 53-й код, а я менял 51-й

"The optional group code 53 is the rotation angle of the dimension text away from its default orientation (the direction of the dimension line) (optional)

All dimension types have an optional 51 group code, which indicates the horizontal direction for the dimension entity. The dimension entity determines the orientation of dimension text and lines for horizontal, vertical, and rotated linear dimensions
This group value is the negative of the angle between the OCS X axis and the UCS X axis. It is always in the XY plane of the OCS "

Однако какое свойство меняет 51-й код при беглом просмотре я не нашел.

Подправил свой код, добвив дополнительную проверку.
AY вне форума  
 
Автор темы   Непрочитано 27.03.2005, 23:02
#12
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


Программа АУ работает как надо. Огромное спасибо. Я переделал здесь только угол по умолчанию вместо 0 теперь 180. Fantomas, через третий файл обкатаю завтра на работе, но дело в том, что проводить такую работу надо one by one, один размер за другим. Потому-что в насыщенном черт. при перевороте размеров одним махом не глядя их текст наедет на соседей. Вот бы присоединить прогу АУ с копированием через Clipboard или wblock, чтобы надо было не чинить, а сразу получать правильный результат. То есть чтобы размеры в файле-приемнике сразу ложились правильно.
Vova вне форума  
 
Непрочитано 28.03.2005, 00:26
#13
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>AY Я нашел, это просто Rotation, и результат сразу получился как у тебя.
Цитата:
Вот бы присоединить прогу АУ с копированием через Clipboard или wblock, чтобы надо было не чинить, а сразу получать правильный результат.
Через Wblock можно попробывать, только все манипуляции придется совершать с первым чертежом...
{Smirnoff} вне форума  
 
Непрочитано 28.03.2005, 09:13
#14
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


2 AY
Рекомендации:

- или добавить в код запрет выбора на блокированых слоях:
Код:
[Выделить все]
(ssget ":L" '((0 . "DIMENSION")))
или обрабатывать блокировки, как в коде ниже;

- если предполагается запрос угла у пользователя, то желательно предложить дефолтное значение, которое можно получить, как в коде ниже.

2 Fantomas
Кроме того, что TextRotation, это - не поворот размера (с этим вроде сам разобрался), так ещё и угол достаточно странный (исходя из заявленной проблемы). Ниже пример целиком на ActiveX (блокировки слоёв игнорируются, угол определяется по текущему состоянию UCS, только для 2D):
Код:
[Выделить все]
(defun pl:dim-ucs-align (/ adoc angl asel lay lays lock)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        asel (vla-get-activeselectionset adoc)
        lays (vla-get-layers adoc)
        angl (- (* 2 pi) (angle (trans '(0.0 0.0) 1 0) (trans '(1.0 0.0) 1 0)))
  )
  (vla-clear asel)
  (vla-endundomark adoc)
  (vla-startundomark adoc)
  (pl:obj-filter-select-manual asel '((0 . "DIMENSION")))
  (vlax-for i asel
    (setq lay (vla-item lays (vla-get-layer i)))
    (if (= (vla-get-lock lay) :vlax-true)
      (progn (vla-put-lock lay :vlax-false) (setq lock (cons lay lock)))
    )
    (vla-put-rotation i angl)
  )
  (vla-clear asel)
  (foreach l lock (vla-put-lock l :vlax-true))
  (vla-endundomark adoc)
)

(defun pl:obj-filter-select-manual (sel filter)
  (vla-selectonscreen
    sel
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbinteger (cons 1 (length filter)))
      (mapcar (function car) filter)
    )
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbvariant (cons 1 (length filter)))
      (mapcar (function cdr) filter)
    )
  )
)

(defun c:demo () (pl:dim-ucs-align) (princ))
Alaspher вне форума  
 
Непрочитано 28.03.2005, 11:57
#15
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
Сообщение от Alaspher
2 AY
Рекомендации: ...
Ну занаете-ли не простая задача дилетанта научить правильно код писать .

Цитата:
Сообщение от Alaspher
- если предполагается запрос угла у пользователя, то желательно предложить дефолтное значение, которое можно получить, как в коде ниже.
- тут у меня сомнения может лучше в качестве дефолта принимать заначение ситемной переменной VIEWTWIST, как думаете?
AY вне форума  
 
Непрочитано 28.03.2005, 12:10
#16
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от AY
Ну занаете-ли не простая задача дилетанта научить правильно код писать .
Я код дилетантским не назвал бы - ошибки/недостатки и в "Экспрессах" есть, а их очень сильные профи ваяли.
Цитата:
Сообщение от AY
Цитата:
Сообщение от Alaspher
- если предполагается запрос угла у пользователя, то желательно предложить дефолтное значение, которое можно получить, как в коде ниже.
- тут у меня сомнения может лучше в качестве дефолта принимать заначение ситемной переменной VIEWTWIST, как думаете?
Нет, не думаю. Пример:
Код:
[Выделить все]
Command: VIEWTWIST
VIEWTWIST = 0.00 (read only)

Command: (angle (trans '(0.0 0.0) 1 0) (trans '(1.0 0.0) 1 0))
2.40855
Система координат повёрнута, а вид - нет. В моей практике, чаще приходилось выравнивать по UCS, чем по виду. Хотя, вот если сделать запрос у юзера, по чему ориентироваться - "по виду" или "по UCS", то можно уже не спрашивать про угол.
Alaspher вне форума  
 
Непрочитано 28.03.2005, 14:29
#17
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Alasper
Спасибо за хороший пример.

Однако, все что мы делали (или пытались как я) это устранение последствий проблеммы а не её решение. Проблемма же состоит в том что в данном случае "криво" работает копирование. Попробуйте скопировать через буфер размер в первом файле- надписи опять разверутся. Я вчера внимательно рабирался с этим, суть в том что при построении размера группа 51 или свойство Rotation принимает значение угла с осью X в WCS а при копировании принимает значение 0.0. Кстати "растаскивание" через Shift работает нормально.

Может какая нибудь системная переменная влияет на это или существует способ разверуть вид не привязывая его к UCS?
{Smirnoff} вне форума  
 
Непрочитано 09.06.2005, 16:53
#18
vig11

Программист
 
Регистрация: 08.06.2005
Сообщений: 2


Была у меня програмка написанная на LISP. Работала она так:
1) Запуск программы.
2) Отмечаете несколько текстов.
3) Пишете как хотите выровнять тескты (по вертикали или горизонтали).
4) Отмечали точку относительно которой хотели выровнять тексты.
5) Enter.
6) Все обозначенные тексты сдвигались так, чтобы начало текста становилось на линию условно проведенную через точку, которую обозначили в п.4.
Т.к. несколько лет не занимался Автокадом, - эта програмка потерялась. Может быть у кого-нибудь есть что-либо подобное. Напишите пожалуйста код.
__________________
Рождённый толстым, - худеть не может!!!
vig11 вне форума  
 
Непрочитано 09.06.2005, 16:54
#19
vig11

Программист
 
Регистрация: 08.06.2005
Сообщений: 2


Цитата:
Сообщение от AY
Если я правильно понял проблему то может помочь такой код:
Код:
[Выделить все]
(defun c:dim-text-orient (/ a b c ob n)
    (and
        (if (setq a (getorient "\nSpecify angle <0>: "))
            t
            (setq a 0)
        ) ;_ end of if
        (setq n 0
              b (ssget '((0 . "DIMENSION")))
        ) ;_ end of setq
        (while (setq ob (ssname b n))
            (setq n  (1+ n)
                  ob (entget ob)
            ) ;_ end of setq
            (entmod
                (if (setq c (assoc 51 ob))
                    (subst (cons 51 a) c ob)
                    (append ob (cons 51 a))
                ) ;_ end of if
            ) ;_ end of entmod
        ) ;_ end of while
    ) ;_ end of and
    (princ)
) ;_ end of defun
Применять к "неправильным" размерам. С углом ориентации поэксперементируйте, я навскидку не помню как обстоит дело с его вводом в пользовательских системах координат. Однако кажется при вводе с клавиатуры (в градусах) значение определяется относительно МСК.
Отлично работает. Большое спасибо.
__________________
Рождённый толстым, - худеть не может!!!
vig11 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp'ик-2 бы...

Размещение рекламы