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

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

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

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

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

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

__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Просмотров: 6751
 
Непрочитано 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,174


Цитата:
Сообщение от 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,174


А что говорит пошаговое выполнение? На каком именно месте сбой?
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 вне форума  
 
Непрочитано 17.07.2013, 09:12
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Из той же оперы: http://autolisp.ru/2009/09/12/vlide-misc-02/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.07.2013, 12:00
#22
Volodich

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


Цитата:
Сообщение от crosandr Посмотреть сообщение
Ставите точки останова. Почитать можно тут
По вашей ссылке показывают, какую литературу надо читать для того чтобы научиться программированию.
Я может быть что-то неправильно понял, но мне-то надо только разобраться в каком месте программа не работает.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 17.07.2013, 12:03
#23
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Volodich, одно из двух - либо разбираешься в программировании и сам все отлавливаешь / разбираешься где и почему не работает, либо просишь и тебе (может быть) что-то сделают.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2013, 12:04
#24
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(может быть) что-то сделают.
за пирожок
gomer вне форума  
 
Автор темы   Непрочитано 17.07.2013, 12:07
#25
Volodich

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сначала написал свое прошлое сообщение, потом увидел это твое Читаю, смотрю. Я думал, запустить программу и посмотреть как она выполняется - есть какой-то простой алгоритм. Читаю твою статью, может быть пойму.
У меня во-первых по F6 никакая консоль не запускается, во-вторых по F8 никакое "пошаговое выполнение" не начинается, а слышен звук ошибки и все. Ну извините, чайник я, первый раз пытаюсь разобраться. Нам в институте что-то рассказывали про лисп, но естественно я ничего не помню кроме того, что лисп орининальный язык - сначала забивается действие, а потом в скобочках переменные через пробел

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Volodich, одно из двух - либо разбираешься в программировании и сам все отлавливаешь / разбираешься где и почему не работает, либо просишь и тебе (может быть) что-то сделают
Я так понимаю, что люди рады бы помочь, да только у них все работает нормально, а у меня почему-то глючит. Текст командной строки я приводил выше. Поэтому видимо и приходится самостоятельно изучать азы.

Прикладываю картинку как выглядит редактор, до которого я смог "дойти" Обратите внимание, "пошаговое выполнение" - неактивно почему-то.
Изображения
Тип файла: jpg лисп.JPG (245.6 Кб, 115 просмотров)
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...

Последний раз редактировалось Volodich, 17.07.2013 в 12:17. Причина: Добавил картинку
Volodich вне форума  
 
Непрочитано 17.07.2013, 14:53
#26
Do$

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


Цитата:
Сообщение от Volodich Посмотреть сообщение
во-вторых по F8 никакое "пошаговое выполнение" не начинается
А оно и не должно начинаться. Начинать нужно запуском кода из автокада или из консоли. Из автокада - командой upblock, из консоли - (c:upblock). До этого нужно поставить точку останова в коде. Когда до точки останова дойдет, пошагово выполнять с помощью F8.
Do$ вне форума  
 
Автор темы   Непрочитано 17.07.2013, 15:24
#27
Volodich

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


аааа! Вот спасибо, добрый человек! понял теперь! Попробую!
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 17.07.2013, 23:01
#28
Дима_

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


то Volodich я уверен на 99.99% что Вы не туда лезете - покажите мне лог из команд
(vl-load-com)
именно в скобках и upblock
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.07.2013, 07:34
#29
Volodich

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


Кхе Похоже, компьютер меня испугался
Дело было так. Сначала запускал программу без (vl-load-com) в первой строчке. Не работало. Потом добавил эту строчку. Файл lsp вроде в акад перезагрузил. Опять не работало.
Сегодня запускаю - работает!
Толи сам автокад заглючил, толи произошло еще что-то, связанное с перезагрузкой компьютера... Не знаю в чем дело, но работает! Надеюсь, после следующей перезагрузки так и будет работать
Огромное спасибо всем за помощь и поддержку!
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 18.07.2013, 07:48
#30
Дима_

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


Цитата:
Сообщение от Volodich Посмотреть сообщение
Кхе Похоже, компьютер меня испугался
...Файл lsp вроде в акад перезагрузил. Опять не работало...
Толи сам автокад заглючил, толи произошло еще что-то, связанное с перезагрузкой компьютера...
У меня подозрение на другое толи
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.07.2013, 07:49
#31
Volodich

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


Я понял на какое Но честно, файл заново в автокад загружал... Ну да ладно. Если ошибка снова всплывет, буду по Вашим советам разбираться в логах и пошаговом выполнении.
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
Ответ
Вернуться   Форум 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