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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программулька для проставления масштабов вхождений блоков

Программулька для проставления масштабов вхождений блоков

Ответ
Поиск в этой теме
Непрочитано 17.05.2013, 11:33 #1
Программулька для проставления масштабов вхождений блоков
Volodich
 
проектировщик-электрик
 
Челябинск
Регистрация: 20.12.2007
Сообщений: 475

Здравствуйте.
При работе с динамическими блоками в 2006-2008 автокадах (у нас на работе такие) заметил пару пакостей.
При вставке блока через буфер обмена из одного чертежа в другой у него вдруг пропадают ручки настройки. Долго не мог понять в чем дело, потом понял. Что-то сбивается с масштабом блока. Когда вручную в свойствах блока вбиваешь те же самые цифры масштабов, ручки вдруг волшебным образом появляются. Но когда блоков много это мучение.
Сделайте, пожалуйста, кто-нибудь программку, которая бы сама вбивала эти масштабы заново. Как вариант можно "тыкать" мышкой в нужный блок, чтобы программка выбирала в чертеже только эти блоки и не шарилась по всем остальным нормальным. Но можно и все, если это не сильно повлияет на длительность работы.
Для примера кладу файл с таким блоком.

Вложения
Тип файла: dwg
DWG 2004
пример сбитого блока.dwg (687.7 Кб, 3051 просмотров)

__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Просмотров: 6746
 
Непрочитано 17.05.2013, 12:44
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Быстрый выбор - свойства, не?
Do$ вне форума  
 
Непрочитано 17.05.2013, 13:00
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


на скорую руку:
Код:
[Выделить все]
 (vl-load-com)
(defun c:upblock()
  (mapcar '(lambda (obj)
     (vla-put-yscalefactor obj (vla-get-xscalefactor obj))
     (vla-put-zscalefactor obj (vla-get-xscalefactor obj)))
    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.05.2013, 13:03
#4
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Цитата:
Быстрый выбор - свойства, не?
Если масштабы у всех блоков одинаковые - действует!
Но есть блок где-то отражен (бывает и такое), то у него один из масштабов с минусом. Хотя можно, конечно, сделать еще раз быстрый выбор из выбранного.
А вообще спасибо за идею.

Дима_, спасибо!

Мне нужно что-то вроде этого:

Код:
[Выделить все]
 (defun c:upblock()
  (mapcar '(lambda (obj)
     (vla-put-xscalefactor obj (vla-get-xscalefactor obj))
     (vla-put-yscalefactor obj (vla-get-yscalefactor obj))
     (vla-put-zscalefactor obj (vla-get-zscalefactor obj))
  )
    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))))
Но почему-то это не срабатывает. И блоки, по которым "прошелся" такой код возвращаются к жизни только если сначала все их масштабы сделать "1", а потом уже любые. Поэтому может код сделать так?

Код:
[Выделить все]
  (vl-load-com)
(defun c:upblock()
  (mapcar '(lambda (obj)
     (set a (vla-get-xscalefactor obj))     
     (set b (vla-get-yscalefactor obj))     
     (set c (vla-get-zscalefactor obj))     

     (vla-put-xscalefactor obj 1)
     (vla-put-yscalefactor obj 1)
     (vla-put-zscalefactor obj 1)

     (vla-put-xscalefactor obj a)
     (vla-put-yscalefactor obj b)
     (vla-put-zscalefactor obj c)

     )
    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))))
Где a, b и c - внутренние переменные функции. Проблема в том что я не знаю какой командой присвоить им значение и как потом его "достать" из переменной.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...

Последний раз редактировалось Volodich, 17.05.2013 в 13:27.
Volodich вне форума  
 
Непрочитано 17.05.2013, 13:45
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Вместо set напишите setq. И в строчке:
Код:
добавьте переменные:
Код:
[Выделить все]
lambda (obj / a b c)
Динблоки прячут ручки, если масштабы по модулю неодинаковы. Если есть отрицательные значения, значит нужно еще их отдельно обрабатывать. Или отзеркаленность не нужно сохранять?
Do$ вне форума  
 
Автор темы   Непрочитано 17.05.2013, 13:57
#6
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Нужно конечно. Поэтому я и ушел от варианта, где мы масштаб X записываем в масштаб Y и масштаб Z.
Вот сделал как Вы сказали:
Код:
[Выделить все]
  (vl-load-com)
(defun c:upblock()
  (mapcar '(lambda (obj / a b c)
     (setq a (vla-get-xscalefactor obj))     
     (setq b (vla-get-yscalefactor obj))     
     (setq c (vla-get-zscalefactor obj))     

     (vla-put-xscalefactor obj 1)
     (vla-put-yscalefactor obj 1)
     (vla-put-zscalefactor obj 1)

     (vla-put-xscalefactor obj a)
     (vla-put-yscalefactor obj b)
     (vla-put-zscalefactor obj c)
     )
    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget)))))))
Но почему-то не работает. После "выберите объекты" говорит "(nil nil nil nil)" и ничего не делает.
Хотя если убрать строчки:
Код:
[Выделить все]
 (vla-put-xscalefactor obj a)
     (vla-put-yscalefactor obj b)
     (vla-put-zscalefactor obj c)
То масштабы 1 устанавливает без проблем. Странно.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 17.05.2013, 14:05
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Нет не верно - у тебя блоки получаються "неактивные" из-за того, что ты что взял, то и кладешь (а видимо при переносе точность дробного числа "плывет" - которую ты и дублируешь) - тебе надо привести все к 1 масштабу - вот вариант с учетом отрицательных значений:
Код:
[Выделить все]
 (defun c:upblock()
  ((lambda (lst doc)
    (vla-startundomark doc)
    (mapcar '(lambda (obj)
       ((lambda (x y z)
           (vla-put-yscalefactor obj (* x (if (> (* x y) 0) 1 -1)))
           (vla-put-zscalefactor obj (* x (if (> (* x z) 0) 1 -1))))
         (vla-get-xscalefactor obj)
         (vla-get-yscalefactor obj)
         (vla-get-zscalefactor obj)))
       lst)
     (vla-endundomark doc))
  (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex(ssget '((0 . "INSERT")))))))
  (vla-get-activedocument (vlax-get-acad-object))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.05.2013, 14:13
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Странно. Может попробовать менять не ScaleFactor а EffectiveScaleFactor? Типа (vla-put-xeffectivescalefactor obj a) и т.п.
Тьфу ты Дима_ прав
Do$ вне форума  
 
Автор темы   Непрочитано 17.05.2013, 15:25
#9
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Сработало! Спасибо большое!
Потестирую еще на реальных файлах и если что отпишусь!
Кстати, а можешь пояснить в чем проблема? Почему блоки "сбиваются" ?
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 17.05.2013, 15:29
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


По симптомам похоже на проблему чисел с плавающей точкой - которая, видимо, не учтенна при сравнении масштабов, а сбиваться они могут при какой-либо конвертации (в тот-же буфер обмена).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.06.2013, 11:29
#11
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 824


Дима_, У меня почему то не срабатывает ваша программа на динамическом блоке.
В модели есть заготовка детали масштабом 1:1, образмеренная.
Если нужно поменять масштаб детали, делаю это через видовой экран. Масштаб видового экрана ставлю 1:2, командой _chspace размеры и блоки перекидываю из модели в лист. У блока масштабы становятся по 0,5. Применяю к блоку вашу программу и ничего.
Вложения
Тип файла: dwg
DWG 2010
Масштаб.dwg (97.2 Кб, 1767 просмотров)
__________________
AutoCad 2011 -> AutoCad 2013 -> AutoCad 2016 -> AutoCad 2011 -> AutoCad 2022
Astartes вне форума  
 
Непрочитано 04.06.2013, 15:08
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Я ничего не понял - в приложенном файле дин блок "рабочий".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.06.2013, 16:59
#13
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Astartes, мне кажется вы не правильно поняли суть программы. Напишите что вы хотите от программы.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 04.06.2013, 18:18
#14
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 824


Дима_, Volodich, Да, блоки у меня рабочие. Не сбитые. Я просто хотел чтобы масштабы указанных мной блоков, стали равны 1.
__________________
AutoCad 2011 -> AutoCad 2013 -> AutoCad 2016 -> AutoCad 2011 -> AutoCad 2022
Astartes вне форума  
 
Автор темы   Непрочитано 16.07.2013, 10:09
#15
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Дима_, возникла проблема с твоей программой в акаде 2008.
В моем 2006 все работает нормально, а в 2008 выдает такой текст:
Цитата:
Команда: upblock
Выберите объекты: найдено: 1
Выберите объекты:
; ошибка: no function definition: nil
И в результате ничего не делает.
Помоги, пожалуйста, решить проблему!
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 16.07.2013, 11:12
#16
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Цитата:
Сообщение от Volodich Посмотреть сообщение
В моем 2006 все работает нормально, а в 2008 выдает такой текст:
Если других ЛИСП-приложений на этом акаде нет, надо не забыть vl-load-com Пардон, в #6 все есть
Добавлено: в 2010 работает. С учетом #7, где vl-load-com нет, проверьте, чтобы был загружен.

Последний раз редактировалось kp+, 16.07.2013 в 11:27.
kp+ вне форума  
 
Автор темы   Непрочитано 16.07.2013, 14:49
#17
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Спасибо за совет.
Добавил. Хоть убейте, та же фигня! Хотя лисп перезагрузил заново, запустил заново...
Как еще можно узнать в чем дело?
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 16.07.2013, 18:37
#18
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


А что говорит пошаговое выполнение? На каком именно месте сбой?
kp+ вне форума  
 
Автор темы   Непрочитано 17.07.2013, 07:03
#19
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 475


Я не программист. Я не знаю, как сделать пошаговое выполнение. Где можно почитать про него? Или если несложно, может объясните, как его сделать?

Добавлено: покопался по форуму, уже нашел "Сервис - AutoLISP - Редактор Visual LISP" - запустил в акаде. В редакторе сделал "открыть файл" - открыл "upblick.lsp". Текст файла открылся в редакторе. А вот что дальше делать не пойму. Не вижу запуска программы.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...

Последний раз редактировалось Volodich, 17.07.2013 в 08:28.
Volodich вне форума  
 
Непрочитано 17.07.2013, 09:07
#20
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,994


Ставите точки останова. Почитать можно тут
crosandr вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программулька для проставления масштабов вхождений блоков



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Как lisp-ом вывести список вхождений блоков? Unfamous LISP 6 23.08.2012 09:22
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Добавление в модель новых вхождений блоков (уникальных) поштучно Sirius2w AutoCAD 18 26.05.2010 12:19
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46