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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

Ответ
Поиск в этой теме
Непрочитано 28.09.2015, 11:24 #1
Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели
Акбар Доолосбеков
 
Регистрация: 28.09.2015
Сообщений: 28

Вопрос мой заключается в следующем: Есть задача и задача такова, нужно разместить объекты по порядку на определенном участке на рамке если быть точнее, это версия для печати. (Есть рамка таких рамок 388 и соотвественно новых чертежей 388) Но вот в чем беда неужели мне надо каждый чертеж перетаскивать в рамку? Я подумал если расстояние изменить между чертежами, и просто перенести внутрь рамки было бы просто шикарно, но при этом масштаб ни рамок ни чертежей должны оставаться не измененными. Помогите пожалуйста. Я в Автокаде только пару месяцев и поэтому такой хитрости пока не знаю, версия Автокада 2016.

Масштабы Рамок одинаковы и масштабы чертежей тоже, просто я не могу подгонять каждый чертеж к каждой рамке, с масштабами всех объектов отлично, но расстояние если поменять и потом уже перенести на рамку и выбрать все объекты было бы просто супер! Просто таких файлов 14 и в каждом файле по 388 - 420 Чертежей Без рамок.

Файл слишком большой я кусок отрежу и покажу,

Вот маленька я часть, того о чем здесь идет речь

Вложения
Тип файла: dwg
DWG 2013
Для Форума.dwg (493.3 Кб, 2496 просмотров)

Просмотров: 6847
 
Непрочитано 28.09.2015, 16:57
#2
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Основной вопрос - зачем все профили в одном файле ? Удобнее же один фал - один профиль.
Как вариант если все в кучу в одном файле:
1. Разделить файл на отдельные, так чтобы в одном файле был один профиль.
2. Собрать один файл из этих разделённых, но с шагом большим чем существуют.
3. Вставить рамку и выполнить копирование массивом.
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Автор темы   Непрочитано 28.09.2015, 17:26
#3
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Это один файл он так и должен быть! Это одна дорога Мы не будем же разделать дорогу!
Акбар Доолосбеков вне форума  
 
Непрочитано 28.09.2015, 18:36
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


ИМХО, штатными средствами Автокада это не автоматезируется, с другой стороны поместить каждый рисунок в рамку листа, это максимум 10 секунд времени, соответственно 420*10/60 = 70 минут работы, 14 файлов, это 16 часов рабочего времени.
За 3 дня сделаете точно.
Если это разовая задача, то автоматизировать нет смысла, писать программу, которая сама будет анализировать и расставлять по листам по времени никак не меньше (Тем более в файле все взорвано до простейших элементов)
Boxa вне форума  
 
Автор темы   Непрочитано 28.09.2015, 18:48
#5
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


3 дня я в курсе этого, но таких задач раз в месяц! Так как это не проектные а фактические, тоесть был бы проектным да 1 раз сделал и забыл, но фактически там все время меняеться, грунт не так положили щебень не тот и тд и тп. Я бы честно не обращался бы, но и так загружают каждый день работой, и 3 или 2 дня это слишком много, сами Вы тоже строители от части и прекрассно понимаете.
Акбар Доолосбеков вне форума  
 
Непрочитано 28.09.2015, 18:50
#6
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Я бы честно не обращался бы, но и так загружают каждый день работой, и 3 или 2 дня это слишком много,
Всё можно сделать, ща подумаем...
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 28.09.2015, 20:30
#7
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


че за тема, выкладывать файл для разбора в последней версии акада. ну вот зачем..
ssn вне форума  
 
Непрочитано 28.09.2015, 20:54
#8
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


понимаю, не совсем в лоб, но тем не менее....
1. выбираем все рамки, которые вокруг профилей
2. настраиваем принтер на форматку (макрос, мой)
3. заменяем все рамки на рамки форматки (макрос, есть в наборе)
4. переносим обратно на наши профили.
этих телодвижений можно было бы избежать, если бы все профили размещались с одинаковым шагом по оси Х
5. печатаем все профили.
единственно, надо ещё штамп с рамкой на них напялить.
ну тут если это печать на бумагу - сначало напечатать штампы, потом уже печатать на них
если надо ПДФ - надо смотреть про основу. т.е. сначало печатать штамп, а потом уже использовать это дело для печати чертежа. штампже всегда одинаковый...

единственно. в моей программе не должно быть ничего на слое 0. (от этого так задумалась программа на выборе рамок)

в архиве мультик по операциям описаным выше и результат в файле ПДФ

----- добавлено через ~6 мин. -----
в принципе, можно так же сделать наложение рамок и потом использовать любые макросы для печати, которые тут есть.
можно автоматом разнести по лейаутам (был вроде лисп). правда создастся многовато этих лейаутов....
или ещё вариант, это посмотреть, откуда идёт экспорт этих профилей и на том этапе настраивать расстояние между профилями. Тогда на них в принципе можно будет нацепить нормальную штамп. сделать его блоком, и так же заменить одно на другое.

----- добавлено через ~2 ч. -----
чет я... думал надо распечатать... а тут надо сделать что бы все в рамки встало.
ну тогда, если только расширить пустоты между профилями. изначально при их создании.
Вложения
Тип файла: rar для форума.rar (5.15 Мб, 16 просмотров)

Последний раз редактировалось ssn, 28.09.2015 в 21:05.
ssn вне форума  
 
Непрочитано 28.09.2015, 22:49
#9
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от ssn Посмотреть сообщение
ну тогда, если только расширить пустоты между профилями. изначально при их создании.
Не поможет, расстояния длины профилей разное, массив не сойдётся.

Тут только разбивать через _Wblock в отдельные файлы каждый профиль, а потом складывать их в один файл. Это всё я за 2 секунды делаю, но надо чтобы в шаблоне _Wblock была уже рамка.
Надеюсь понятна связь ?
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 28.09.2015, 23:02
#10
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


а массив не обязательно. так же, заменой примитива на примитив
как я показал. копируем рамку допустим со сдвигом 1000 вверх, заменяем её и возвращаем на эту 1000 назад. и все.
главное что бы зазоры позволяли штампам не соприкасаться

замена примитива на примитив конечно не штатная команда... но макрос такой есть.
ssn вне форума  
 
Непрочитано 29.09.2015, 08:50
#11
Кулик Алексей aka kpblc
Moderator

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


maratovich, кто-то мешает потом лист создавать с форматкой?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.09.2015, 08:52
#12
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


А может есть другие программы? Которые помогут решить эту задачу? Вот вы говорите lisp, я там не умею программировать, да и вообще я слаб в программировании.
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:21
#13
Кулик Алексей aka kpblc
Moderator

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


Хоть убей не пойму, кто мешает из рамки сделать блок и блок уже таскать и масштабировать, раз уж так по-дурному выданы данные. Я полагаю, что данные были сформированы программно - просто программка не отлажена на выдачу нормального результата.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.09.2015, 09:27
1 | #14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Оказалось там все очень просто... Правда я в Лисп не силен, так что помочь автору наверное не смогу, но для собственного развлечения на C# написал.
https://youtu.be/yHMwENX_MoM
Boxa вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:31
#15
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от Boxa Посмотреть сообщение
Оказалось там все очень просто... Правда я в Лисп не силен, так что помочь автору наверное не смогу, но для собственного развлечения на C# написал.
https://youtu.be/yHMwENX_MoM

Ого это очень классно, скажите как мне это сделать?
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:44
#16
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


это фотошоп )))
эх, красиво. хорошо наверно так сильно програмировать... рутинных операций в процессе проектирования просто нет наверно )))
ssn вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:45
#17
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Нет не думаю что это фотошоп
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:47
#18
ssn

Инженер проектировщик (раздел ТМ - фриланс)
 
Регистрация: 06.12.2003
Геленджик
Сообщений: 1,794
Отправить сообщение для ssn с помощью Skype™


да конечно нет. это шутка такая.
ssn вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:48
#19
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Вот мне бы такое, вообще классно было бы! Ни как нельзя его сделать?
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:49
#20
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 982


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Вот мне бы такое, вообще классно было бы! Ни как нельзя его сделать?
А как Вы получаете профиля ? В какой зависимости их на чертеже расставляете ?
baksconstructor вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:52
#21
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
А как Вы получаете профиля ? В какой зависимости их на чертеже расставляете ?
Я не понял вопроса можете объяснить по другому
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:54
#22
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 982


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Я не понял вопроса можете объяснить по другому
Откуда профиля в чертеже ? Из какой программы ?
Больше интересует - они вставлены рядком, почему именно горизонтально и можно ли их вставить по другому?
baksconstructor вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:59
#23
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Автокад 2016 / 2015

Они радком стоят, но размер и масштаб нельзя менять! По другому не знаю как можно вставить, можно ручками, за 3 дня. Я же говорил что вчера в одном файле нашел 499, рамок и 499 чертежей. Теперь все это надо вставить в рамки, если размер чертежа больше чем рамка, придеться опять измерять на дороге, то есть где сделали ошибку но не проектировщики. Но большенство чертежей правильны, и их нужно в рамки вставить.
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 10:01
#24
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


я в лисп совершенно ничего не понимаю, потому
Цитата:
Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели
для меня непосильная задача.

на C# я скопипастил и скомбинировал несколько примеров из справки.
Выглядит это примерно так:
Выбрать рамки, у автора это полилиния длинной в диапазоне 1420-1430
Выбрать профиль, тут просто полилинии, текст попадающий в секущую рамку отсеиваю
Сортирую обе выборки по Х
для каждой пары профиль-формат считаю вектор смещения
Выбираю объекты внутри рамки профиля и смещаю по вычисленному вектору и так для каждой пары.

Просто как молоток
Цитата:
Сообщение от ssn Посмотреть сообщение
рутинных операций в процессе проектирования просто нет наверно
Я конструктором работаю, моя работа - думать и конструировать.
Boxa вне форума  
 
Автор темы   Непрочитано 29.09.2015, 10:04
#25
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


А я могу ли попробовать Вашу комбинацию на С#? Я толком и не программист, но видно же что у Вас получилось, чем это не ответ?
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 11:20
1 | #26
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Честно говоря это не самая хорошая идея. Между программой написанной на коленке для проверки идеи и программой которую можно дать пользователям - большая пропасть.
Доводить эту программу до годного к использованию уровня мне лень, а в том виде в котором она есть сейчас, малейшая неточность и фатал ерор. Это похоже на подростка с дробовиком, чуть что и отстрелил себе ногу...

Библиотека под 2016 автокад во вложении, используйте на свой страх и риск (AS IS), никакой ответственности с моей стороны.
команда: Sorted
Сначала выбрать рамки форматов, затем рамки вокруг профиля, после выбора отзумить, что бы был виден весь файл (Да, для проверки идеи использовал выбор рамкой, со всеми его ограничениями).
Вложения
Тип файла: zip AkbarDoolosbekov_2016.zip (3.9 Кб, 17 просмотров)
Boxa вне форума  
 
Непрочитано 29.09.2015, 17:02
#27
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Акбар Доолосбеков результат есть ?
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 30.09.2015, 00:01
#28
gomer

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


1 сортируем форматки по х - это блоки
2. сортируем профиля по х - это блоки
3. вставляем последовательно один блок внутрь второго блока, получаем красивое видео с кучей латентных НО
gomer вне форума  
 
Непрочитано 30.09.2015, 08:35
#29
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


gomer, ну ты прям покровы сорвал и про латентные НО меня разоблачил
Boxa вне форума  
 
Непрочитано 30.09.2015, 09:45
#30
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Подумал я, что лисп для этого случая простенький, учитывая, что и профиля, и форматки окружены рамками в разных слоях. Ну, написал. В чертеже, где 2 - 3 десятка элементов, работает отлично. Но сделал я чертеж где-то с 600 элементами, и стала получаться ерунда: похоже, что при выполнении foreach при каждом переносе профиля в наборе выбора остается часть объектов прежнего набора и, соответственно, они перемещаются еще раз. Вот такая чертовщина.
Код:
[Выделить все]
 (vl-load-com)
;;;Создаем 2 списка полилиний по слоям
(setq ss1(ssget "_X" '((67 . 0)(8 . "KINDEX")))
      lst1 nil
      ss2(ssget "_X" '((67 . 0)(8 . "PRINT")))
      lst2 nil)
(repeat(sslength ss1)
	  (setq lst1(cons(vlax-ename->vla-object (ssname ss1 0))lst1))
	    (ssdel(ssname ss1 0)ss1))
(repeat(sslength ss2)
	  (setq lst2(cons(vlax-ename->vla-object (ssname ss2 0))lst2))
	    (ssdel(ssname ss2 0)ss2))

;;;Упорядочиваем списки по положению относительно оси Х
(defun s_pos (lst)
  (mapcar(function cadr)
 (vl-sort      
(mapcar '(lambda (x)(vla-GetBoundingBox x 'MinPt 'MaxPt)
	   (list (vlax-safearray->list MinPt) x))lst)
(function(lambda (e1 e2)(< (caar e1) (caar e2)))))))
(s_pos lst1)
(s_pos lst2)

;;;Выделяем внутри рамки и переносим от центра рамки к центру форматки
(foreach x lst1 (setq p_co1(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates x)))
                      ss3(ssget "_W" (list(car p_co1)(cadr p_co1))(list(nth 4 p_co1)(nth 5 p_co1)))
		      pt1(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbDouble '(0 . 2))
					     (list(/(+(car p_co1)(nth 4 p_co1))2)(/(+(cadr p_co1)(nth 5 p_co1))2)0)))
		      p_co2(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates(car lst2))))
		      pt2(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbDouble '(0 . 2))
					     (list(/(+(car p_co2)(nth 4 p_co2))2)(+(/(+(cadr p_co2)(nth 5 p_co2))2)21.5)0))))
  (foreach y (vl-remove-if 'listp(mapcar 'cadr(ssnamex ss3)))
    (vla-Move(vlax-ename->vla-object y) pt1 pt2))

;;;Безуспешно пытаюсь заставить очиститься набор SS3  
  (repeat(sslength ss3)
    (ssdel(ssname ss3 0)ss3))
  (setq ss3 nil
	lst2(cdr lst2))
  (gc)
  );end of foreach
P_S вне форума  
 
Непрочитано 30.09.2015, 15:08
#31
kp+

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


сильно в код пока не вникал и не тестировал, но заметил, что используется режим выбора "_W" (обычная рамка). Если координаты углов рамки не попадают в видимую на экране область, его результаты бывают непредсказуемые. Поэтому предлагаю в начале программы добавить что-то типа
Код:
[Выделить все]
 (vl-cmdf "_zoom" "_e")

Последний раз редактировалось kp+, 30.09.2015 в 15:30.
kp+ вне форума  
 
Автор темы   Непрочитано 01.10.2015, 15:55
#32
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от maratovich Посмотреть сообщение
Акбар Доолосбеков результат есть ?
Есть результат, но все равно делаю в ручную по 5 максимум 10, так как там 6 или 7 чертеж падает вниз на рамку и приходитья поднимать а когда по 5 то все нормально.

----- добавлено через ~4 мин. -----
Что посоветуете люди добрые? Продолжать по 5 - 10 штук? Или можем что нибудь другое попробовать?
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 15:59
#33
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Вот ничего не понял, можно выложить файл с тем местом, где это случилось?
В ролике явно больше 10 форматок было и ошибок обработки не было.
Такое поведение может быть если Вы неправильную рамку форматки выбрали.

ЗЫ.
А вообще если не жалко, в личном сообщении скиньте файл с 400 листами...
Boxa вне форума  
 
Автор темы   Непрочитано 01.10.2015, 16:01
#34
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Нет я все сделал как на видео и рамки отмерил, все одинаково, но чертежи не все одинаковые, по моему из за этого.
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 16:01
#35
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 982


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Или можем что нибудь другое попробовать?
Думаю если этим заинтересовался maratovich, то Вам лучше у него спросить...
baksconstructor вне форума  
 
Непрочитано 01.10.2015, 16:10
#36
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
чертежи не все одинаковые, по моему из за этого.
см, нужен пример.
Boxa вне форума  
 
Непрочитано 01.10.2015, 16:53
#37
Кулик Алексей aka kpblc
Moderator

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


При условии расположения и форматок, и объектов только в горизонтальном положении. Тестировал только на файле из шапки. Честно говоря, результатом не сильно доволен, но допиливать некогда:
Код:
[Выделить все]
 (vl-load-com)
(defun c:test (/                  adoc               _kpblc-selset-msg  _kpblc-conv-selset-to-ename
               _kpblc-conv-vla-to-list               ss_format          ss_obj             minl
               ss_move            dist               i
               )

  (defun _kpblc-selset-msg (msg fun-ssget / sysvar res)
    (setq sysvar (mapcar (function (lambda (x / tmp)
                                     (setq tmp (getvar (car x)))
                                     (setvar (car x) (cdr x))
                                     (cons (car x) tmp)
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                         '(("cmdecho" . 0) ("menuecho" . 0) ("nomutt" . 1))
                         ) ;_ end of mapcar
          ) ;_ end of setq
    (princ (strcat "\n" (vl-string-trim " \n\t:" msg) " <Отмена> : "))
    (setq res (vl-catch-all-apply fun-ssget))
    (foreach item sysvar
      (setvar (car item) (cdr item))
      ) ;_ end of foreach
    (if (= (type res) 'pickset)
      res
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) (mapcar (function _kpblc-conv-ent-to-ename) selset))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar (function _kpblc-conv-vla-to-list) value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (= (type value) 'vla-object)
            (vlax-property-available-p value 'count)
            ) ;_ end of and
       (vlax-for sub value
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_objbox (obj / minp maxp)
    (setq obj (if (= (type obj) 'ename)
                (vlax-ename->vla-object obj)
                obj
                ) ;_ end of if
          ) ;_ end of setq
    (vla-getboundingbox obj 'minp 'maxp)
    (list (cons "obj" obj)
          (cons "min" (setq minp (_kpblc-conv-vla-to-list minp)))
          (cons "max" (setq maxp (_kpblc-conv-vla-to-list maxp)))
          (cons "mid" (mapcar (function (lambda (a b) (* 0.5 (+ a b)))) minp maxp))
          ) ;_ end of list
    ) ;_ end of defun

  (if (and (setq ss_format (_kpblc-selset-msg "Выберите форматки" (function (lambda () (ssget)))))
           (setq ss_obj (_kpblc-selset-msg "Выберите перемещаемые объекты" (function (lambda () (ssget)))))
           ) ;_ end of and
    (progn
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (setq ss_format (mapcar
                        (function fun_objbox)
                        (vl-remove-if-not
                          (function
                            (lambda (x)
                              (and (= (cdr (assoc 0 (entget x))) "LWPOLYLINE")
                                   (= (strcase (cdr (assoc 8 (entget x)))) "ANTET")
                                   ) ;_ end of and
                              ) ;_ end of lambda
                            ) ;_ end of function
                          (_kpblc-conv-selset-to-ename ss_format)
                          ) ;_ end of vl-remove-if-not
                        ) ;_ end of mapcar
            minl      (apply (function max)
                             (mapcar
                               (function
                                 (lambda (x)
                                   (distance (cdr (assoc "min" x)) (cdr (assoc "max" x)))
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ss_format
                               ) ;_ end of mapcar
                             ) ;_ end of apply
            ss_format (vl-sort
                        (vl-remove-if-not
                          (function
                            (lambda (x)
                              (equal (distance (cdr (assoc "min" x)) (cdr (assoc "max" x))) minl 1e-3)
                              ) ;_ end of lambda
                            ) ;_ end of function
                          ss_format
                          ) ;_ end of vl-remove-if-not
                        (function
                          (lambda (a b)
                            (< (cadr (assoc "mid" a)) (cadr (assoc "mid" b)))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-sort
            ss_obj    (vl-sort (mapcar (function fun_objbox)
                                       (_kpblc-conv-selset-to-ename ss_obj)
                                       ) ;_ end of mapcar
                               (function
                                 (lambda (a b)
                                   (< (cadr (assoc "mid" a)) (cadr (assoc "mid" b)))
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-sort
            i         -1
            ) ;_ end of setq
      (foreach item (vl-remove-if-not
                      (function
                        (lambda (x)
                          (and (wcmatch (strcase (vla-get-objectname (cdr (assoc "obj" x)))) "*POLYLINE")
                               (= (strcase (vla-get-layer (cdr (assoc "obj" x)))) "KINDEX")
                               ) ;_ end of and
                          ) ;_ end of lambda
                        ) ;_ end of function
                      ss_obj
                      ) ;_ end of vl-remove-if-not
        (setq ss_move (vl-remove-if-not
                        (function
                          (lambda (x)
                            (and
                              (apply 'and (mapcar '<= (cdr (assoc "max" x)) (cdr (assoc "max" item))))
                              (apply 'and (mapcar '>= (cdr (assoc "min" x)) (cdr (assoc "min" item))))
                              ) ;_ end of and
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ss_obj
                        ) ;_ end of vl-remove-if
              i       (1+ i)
              dist    (mapcar
                        (function -)
                        (cdr (assoc "mid" item))
                        (cdr (assoc "mid" (nth i ss_format)))
                        ) ;_ end of mapcar
              ) ;_ end of setq
        (foreach ent ss_move
          (setq ss_obj (vl-remove ent ss_obj))
          (vla-move (cdr (assoc "obj" ent))
                    (vlax-3d-point (cdr (assoc "mid" ent)))
                    (vlax-3d-point (mapcar (function -)
                                           (cdr (assoc "mid" ent))
                                           dist
                                           ) ;_ end of mapcar
                                   ) ;_ end of vlax-3d-point
                    ) ;_ end of vla-move
          ) ;_ end of foreach
        ) ;_ end of foreach
      (vla-endundomark adoc)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2015, 17:32
1 | #38
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Попробуй библиотеку во вложении.
Выбирать можно как попало, наличие выбранных объектов на экране не обязательно...
Вложения
Тип файла: zip AkbarDoolosbekov_2014-2016.zip (4.1 Кб, 10 просмотров)
Boxa вне форума  
 
Автор темы   Непрочитано 01.10.2015, 17:36
#39
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от Boxa Посмотреть сообщение
Попробуй библиотеку во вложении.
Выбирать можно как попало, наличие выбранных объектов на экране не обязательно...
Команда та же "Sorted"
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 17:42
#40
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


угу
Boxa вне форума  
 
Непрочитано 01.10.2015, 20:27
#41
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
Думаю если этим заинтересовался maratovich
Ну не совсем чтобы заинтересовался, но своё решение уже есть.

Тут самое интересное будет, когда автор скажет, что у него профиля и рамки не в одну линию.
А ещё хлеще если они в перемешку или есть только профиля...

Если автора заинтересует у меня реализовано как я писал и прежде:
1. Разделить файл на отдельные, так чтобы в одном файле был один профиль.
2. Собрать один файл из этих разделённых, но с одинаковым шагом, большим чем существуют.
3. Вставить рамку и выполнить копирование массивом.
4. Переномеровать номера листов.

Все это не за один проход и не быстро, но практически автоматом, и переваривает "интресное" описанное выше.
Акбар Пишите в скайп, покажу.
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 02.10.2015, 11:21
#42
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,589


Акбар Доолосбеков, и как результат? Поведение описанное ранее появляется?
Boxa вне форума  
 
Непрочитано 02.10.2015, 14:01
#43
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Кулик Алексей aka kpblc, попытался я протестировать твой код на файле с ~ 600 профилями. Есть в нем существенный недостаток - время обработки возрастает в геометрической прогрессии в зависимости от количества объектов: на каждый перенос профиля у тебя сканируется весь список объектов. Поэтому, для файла более чем со 100 профилями программа становится практически неприменима. Такой вот не очевидный момент.
P_S вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пакетная печать множества рамок (форматов) из пространства модели. maratovich AutoCAD 410 23.08.2023 16:17