|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Собрать содержимое МТЕкста с разных листов в один документ/объект
вольный копейщик
Регистрация: 03.11.2010
Сообщений: 132
|
||
Просмотров: 8462
|
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,194
|
Цитата:
Гарантированно один Мтекст на каждый лист? Тогда вообще элементарно. Но если есть другие надписи, выполненные Мтекстом, нужные надо будет отфильтровать (по цвету, слою или другим признакам). Или просто убрать из результатов (таблицы или внеш. файла) то, что явно не подходит. Осваивайте подшивки. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
baksconstructor, примерно так.
kp+, нет, текст там конечно не один. Подшивки мне тут ничем не помогут, как мне кажется. Если я работаю в 1 файле и без коллективной работы, вообще не вижу смысла в подшивках - публикация решает все те же задачи. |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,194
|
По файлу примера этого не скажешь
![]() Offtop: А он есть даже при таком раскладе. И кроется в том, что нумерация листов, их наименования и перекрестные ссылки хранятся в подшивке и автоматически обновляются. Без подшивки надо все хранить в голове. Впрочем, это сотни раз обсуждалось в "профильных" темах и здесь не к месту. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Примерно так?
Код:
Иными словами создать для таких текстов отдельный слой или дать им особенный вес, например, и следить за тем, чтобы лишних мтекстов с такими свойствами не было. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Спасибо всем огромное!
Просто реальный пример я приложить не могу из-за политики о неразглашении. Там конечно штампы есть, и на их уровне уже все забито "личной" информацией фирмы через поля, поэтому выложил "голый" пример. Но сути задачи это не меняет. Слой отдельный сделать для этого вообще не проблема. Про извлечение данных почему-то не подумал в данном случае! Спасибо за наводку. Код тоже попробую, чуть позже отпишусь, что вышло. Желательно, чтобы порядок сбора соответствовал порядку листов в файле. Насчет подшивок - я с ними игрался, но кроме "лишних" действий по их созданию для своей практики пользы в них не нашел. Номер листа у меня в штампе заполняется через CTAB - пробовал много способов, этот - самый удобный. Вся инфа в штампе - опять же поля, из централизованного источника все попадает в нужное место на каждом листе. Фамилии - аналогично. Машстаб ВЭ - тоже сам попадаем в штамп через поле. Печать - через экспорт в PDF - в один клик все листы. Я против подшивок ничего не имею, уточняю, чтобы камни в меня не полетели ![]() skkkk, код почему-то не заработал. Я создал слой Текст2, туда перенес Мтексты с листов. В коде заменил слово "текст" на "Текст2", после запуска просто открывается диспетчер слоев, либо справка, либо какая-то рандомная команда и все... больше ничего не происходит. Последний раз редактировалось Immortal_6666, 08.02.2017 в 19:59. |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,194
|
Цитата:
![]() Впрочем, можно сделать иначе: вместо обычных Мтекстов создать блоки с двумя атрибутами: - в первом - поле вида %<\AcVar ctab>% - во втором (многострочном) - наименование чертежа. Первый атрибут может быть на непечатаемом слое, а может использоваться - дело вкуса. Тогда результаты извлечения данных можно сортировать по первому атрибуту. Что используется в качестве централизованного источника, если не секрет? Последний раз редактировалось kp+, 08.02.2017 в 18:24. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
kp+, свойства документа - там заполняю нужные строки.
С извлечением данных вышла какая-то ерунда... не нашел там фильтра по слоям, и почему-то служебные знаки отображает в тексте.. не пойму как искать только по мтекстам с листов.. UPDATE Только по Мтекстам искать научился, но он выдергивает вообще все... и кучу "мусора" в строку вставляет - \pxqc,t18; Опять же, никакого порядка и последовательности.. не очень подходит метод. Вариант с кодом был бы оптимален. Очень надеюсь на skkkk =) Последний раз редактировалось Immortal_6666, 08.02.2017 в 18:21. |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,194
|
Цитата:
По поводу очистки форматирования Мтекста есть отдельная тема, поиск по форуму в помощь. Знаки \P (абзац) в результатах извлечения данных нетрудно поиском-заменой убрать. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Да, я прочитал.
Теорически можно. Правда от Мтекстов не очень хочется уходить - у меня из них потом тоже через поля "улетает" всё в другое место листа это раз. И сами эти Мтексты формируются из полей. Наверное. можно загнать поле в текст атрибута, но я так еще не пробовал и это все усложняет процесс работы. Тут задача "минимизировать" пляски с бубном, а с поиском заменой уже набирается процесс посложнее, чем просто по листам пройтись с CTRL+C =)) Самый оптимальный вариант - как-то "считать" все Мтексты с каждого листа по параметру слой (для них я бы сделал уникальный слой) и собрать их в одно место. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Это не подойдет? Автозаполнение ведомости рабочих чертежей
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Цитата:
Оффтоп: где бы (и у кого) в Питере программированию под AutoCAD поучиться?... |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,194
|
А в результате получается сложнее и хуже...впрочем, код под именно Ваши нужды тоже можно написать...но это больше в "поиск исполнителей".
Offtop: Цитата:
|
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Я тестировал на 2011-й и 2015-й версиях - работает. |
|||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
|
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
skkkk, копировал кнопками, пробовал в разных файлах. пробовал запихнуть код в .lsp файл - тоже не помогло... попробую еще слой на латинице сделать.
UPDATE! Со слоем латинскими буквами заработало!!! Спасибо! Похоже, что это то, что нужно! skkkk, Вы - гений! Работает и в 2017 версии - похоже, что во всех. С порядком правда, да - беда. А сделать так, чтобы еще и русские слои понимал и порядок по порядку листов очень сложно? Или номер листа перед текстом добавлял - у меня листы названы просто цифрами, можно из CTAB брать значение, но Ваш код я не понимаю, потому не знаю куда это добавить. А отсортировать потом можно уже и в ворде. Пока начал разбираться с функциями setq и ssget. =) буду дальше гуглить. Как я пытаюсь понять Ваш код: Мы объявили о создании команды TEST, создали две локальные переменные ss и i и сказали, что они типа string Далее присвоили переменной ss значение, возвращаемое функцией ssget, которая выделила объекты типа MTEXT - т.к указан групповой код 0 на конкретном слое (т.к. код 8). Вот тут я правда не понял - ssget выделяет объекты по критериям, и получается в переменную ss мы сразу содержимое всех мтекстов засунули??? как он понял, что надо именно содержимое взять? И вот что дальше в коде происходит мне уже непонятно.. Последний раз редактировалось Immortal_6666, 08.02.2017 в 22:11. |
|||
![]() |
|
||||
Регистрация: 05.11.2014
Сообщений: 944
|
Immortal_6666
Тогда Вам прямая дорога к Реверс. Эта прога найдёт Вам наименование, номера листов и другую инфу, воздаст ведомость в нужном порядке и т.д. А Ваш пример файла - нужна только рамка со штампом, логотип можете удалить. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
В какой текстовый редактор вставляете код для сохранения в lsp? Судя по проблемам с кодировкой, это скорее всего, Notepad++? Там надо в настройках выставить кодировку в ANSI или в Windows-1251. С Блокнотом такого быть не должно.
Что предпочтительней, чтобы или ? Цитата:
----- добавлено через ~6 мин. ----- Только сейчас увидел отдельную тему на этот счет. Согласен с тем, что ее бы в Программирование надо отнести, но проще было попросить модераторов перенести ее в тот раздел, а не создавать такую же, это, выходит, - нарушение правил форума. Думаю, стоит удалить ту, а эту перенести туда. ----- добавлено через ~7 мин. ----- "Та" - эта вот эта: Помогите допилить LISP собирающий Мтексты с листов в буфер обмена. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
baksconstructor, извлечение данных? Там же все тексты в основной надписи на одном слое, и я не нашел в них "изюминки", по которой можно было бы вычленить их из общей массы.
И еще вопрос: будет ли это быстрее для каждого чертежа, чем запустить лисп, предварительно создав блок, шаблон или что-то подобное, в котором нужные тексты будут с "изюминкой"? Даже учитывая то, что можно использовать извлечение данных по шаблону. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Тут я
![]() С темами - понял. Теперь по сути вопроса. Это не основная надпись - не штамп это, в блок это пихать не удобно. Решение с LISP-ом мне кажется оптимальным. Особенно, если потом его на кнопку повесить или на палитру. Проблемы создать под это дело отдельный слой вообще нет. И да, если удастся "добить тему", то сразу добавлю этот слой в свой шаблон. skkkk, чтобы понимал порядок - это было бы оптимально, нумерацию я сам потом сделаю в word. Просто про номера написал на случай, если это вдруг проще, чем с порядком задачу решить, тогда я бы их потом сортировал руками. Про переменные я уже сообразил ![]() Пытался в vlide отслеживать значения переменных - как-то не получается... у ss еще иногда пишет 160 или 190 значение (опять же не понимаю, что он там считает и в каких единицах - думал буквы поштучно - ни фига), а i и str всегда nil.. но гораздо чаще когда пытаюсь вставлять куски кода пишет в консоли "неверно сформированный список на входе". В общем путь "понять код по кусочкам" пока не проходит.. При том, что код целиком работает. Не до конца понимаю, можно ли как-то замедлить исполнение команды и в реальном времени видеть изменение значений переменных? Пробовал "точки останова" - но что-то не то, или опять же не так использую. В принципе теперь понял, что делают defun, setq, ssget, sslength. Правда у ssget адский синтаксис... просто жесть. Так и не понял, зачем там апостроф перед скобкой - `((0 . - точки еще эти через пробелы.. Видимо, это точечные пары. Что делает vl-load-com тоже понял. А вот как цикл с repeat работает и что там "записано" пока не догоняю. i там каждый раз уменьшается на 1, видимо при 0 цикл останавливается. Ssname видимо возвращает "внутреннее" имя конкретного Мтекста из ранее выделенного набора. Потом он видимо помещается в новую строку и так с каждым Мтекстом. Но это догадки, из кода я этого не могу понять ![]() Текст вставлял в обычный блокнот. Попробую в ++ с кодировкой поиграться. Спасибо! baksconstructor, нет, у меня другая задача - ровно такая как я описал и выглядит как в примере, который я приложил в начале. Еще раз повторюсь, речь не о не штампе. Это имя листа, но оно скажем так не полное, а в штампе выводится тоже + масштаб - туда как раз попадает через поля из этого Мтекста и ВЭ. Слои делаю какие хочу, для старых проектов такие списки уже составлены, соотв. просто пытаюсь оптимизировать процесс на будущее. В принципе сразу про это и писал. UPDATE С vlide более менее разобрался (спасает Полищук) перекодировал файл в ANSI (был в UTF-8) - теперь все отлично, русские слои понимает!!! УРА! Остался порядок ![]() Последний раз редактировалось Immortal_6666, 10.02.2017 в 18:57. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Код:
Сортирует строки в соответствии с порядком следования листов - не по номерам в именах листов. Кстати вспомнил, как-то делал прогу для автонумерации листов, думаю, при подобном подходе сгодится: Код:
|
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
skkkk, Спасибо огромное!!! Потестирую, отпишусь. Я уже и на кнопку смог подвесить загрузку лиспа и вызов команды - ^C^C(if (null C:_LISTIK)(load "listik"));_LISTIK;
Если теперь будет сортировать - вообще божественно! С нумерацией проблем не было, но все равно спасибо! Я просто листы по 1 создаю - заранее никогда не известно, сколько их в проекте будет. Местами тоже не так часто меняю. Но может и найду применение второму скрипту. UPDATE Попробовал - работает, собирает в список в правильном порядке! Собирает отлично! Единственное, что нашел - текст получается какой-то странный - его отказывается нумеровать и нумератор в автокаде, просто ставит цифру 1 и нумератор в word - тоже ставит просто 1, как-будто строки не разделены. Хотя там явно есть переход на след. строку.. какая-то странная особенность. Там даже по спец. символам в Ворде видно, что новая строка начинается не как "настоящая" новая строка, а как новая строка без разрыва - то, что делается по сочетанию клавиш SHIFT+ENTER. В общем какая-то пляска с последующей нумерацией. В остальном, ок. С кнопки запускать вообще шикарно! P.S. Есть какая-то команда, которую можно добавить в конце кода, чтобы он сразу содержимое Мтекста в буфер винды копировал? PPS. Напишите мне в личку какие-нибудь свои реквизиты (карту/номер телефона) - я хоть символическую благодарность Вам переведу, действительно очень помогли! Последний раз редактировалось Immortal_6666, 10.02.2017 в 19:54. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Проблема ясна, попробую разобраться.
Цитата:
----- добавлено через ~21 мин. ----- Код:
Код:
Последний раз редактировалось skkkk, 10.02.2017 в 22:32. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Да, вставка в текущий документ по смыслу и не нужна. Нужно в буфер только, единственное, можно какое-то сообщение выводить, что команда успешно отработала, прямо в командной строке - глянул, увидел, что все ок. Но опять же, если это как-то очень заморочисто, то и не надо. То, что сейчас уже отлично. Я просто думал, что можно как-то "по-простому" зайти в этот подготовленный мтекст, взять его содержимое и что-то вроде ctrl+с сделать программно, потом текст стереть. Но по коду вижу, что там как-то сложно все выходит.
Второй вариант работает отлично! А первый, где через буфер выдает - ; ошибка: no function definition: COPYTOCLIPBOARD Последний раз редактировалось Immortal_6666, 10.02.2017 в 21:51. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Цитата:
Код:
Код:
Цитата:
Может, надо перезагрузить Автокад и заново загрузить код? Просто, возможно, как-то конфликтуют одна версия с другой. ----- добавлено через ~13 мин. ----- Или попробовать загрузить отдельно функцию Код:
----- добавлено через ~14 мин. ----- Сейчас есть возможность тестировать только на 2011 - там все работает. В более поздних версиях появились разные политики безопасности, с которыми я еще не очень знаком. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Перезагрузил, пробовал в разных версиях 2014 и 2017 - та же ошибка. Пробовал и как текст в VLIDe копировать и как отдельный .lsp файл подгружать...
Насчет отдельно загрузить не понял... сделать отдельный LISP и ее потом вызывать? Не понял как это состыковать с основным кодом. Этот кусок сам по себе ошибок не выдает. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Да, под спойлером эта функция отдельно. Сохранить ее в отдельный файл и перед запуском TEST загрузить этот файл. Правда в этом случае ее лучше стереть из основного кода, дабы разных конфликтов не было. Я там еще подтёр разные ненужные вещи, которые гипотетически могут вызывать ошибки.
|
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Цитата:
UPDATE Вроде разобрался. Сделал отдельный файл. В основном эту часть удалил. И вызываю все это дело таким скриптом ^C^C(if (null C:_COPYTOCLIPBOARD)(load "copytoclip.lsp"));(if (null C:_LISTIK)(load "listik.lsp"));_LISTIK Я заменил имя TEST на LISTIK. Все работает похоже. В модель не вставляется, в буфер копируется. Это просто отлично! Но я так и не нашел строку (copyToclipboard str) чтобы вставить оповещение =))) Последний раз редактировалось Immortal_6666, 10.02.2017 в 22:54. |
|||
![]() |
|
||||
вольный копейщик Регистрация: 03.11.2010
Сообщений: 132
|
Все, нашел! Добавил! Я просто в конце кода почему-то искал.
Все супер теперь! Для меня это настолько "хаманство", что даже не верится! Спасибо еще раз! А Вы именно программист? Или пользователь автокада? Я конечно продолжу все это изучать, просто интересно, сколько лет надо потратить, чтобы так влёт решать подобные задачи? Я профессиональным программистом уже точно не стану, да и цели такой нет, но научиться писать подобные вещи для автоматизации рутины хотелось бы. Просто по одному направлению работа реально типовая, может еще что-то удастся формально описать и реализовать программно. Хотя на данный момент кажется, что автоматизировал все, что мог. Рутины все равно очень много но она уж больно вариативная. Если еще какие-то идеи будут, можно продолжить задавать вопросы в этой теме? Не в том смысле, чтобы рассчитывать на реализацию задачи, а чтобы описать ситуацию и хотя бы получить ответ в стиле "так сделать программно можно", "так сделать нельзя". П.С. Насчет благодарности я серьезно писал, так что надумаете - пишите в лс. |
|||
![]() |
|
||||
Регистрация: 20.03.2008
Сообщений: 2,680
|
Когда-то также просто захотел упростить рутину и также пришел сюда за помощью. Не могу судить сам, что я должен из себя представлять, чтобы слыть программистом. Я бы сказал, что пока просто - программист-любитель, по большей части - пользователь. Для меня это пока больше хобби. Да и задачка Ваша - довольно плёвая. Тут есть мастодонты, которые бы при желании решили бы ее намного "влётнее" и красивее. В основном, для себя и довольно узкого круга моих коллег уже приходилось решать на порядок более сложные задачи, повысив в разы производительность. Доводилось участвовать и в более ли менее серьезных сторонних проектах.
Цитата:
Хочу сказать, что это все вполне реально - освоить для себя программирование, - и стоит того, особенно, если в удовольствие. Только, возможно, стоит подумать над выбором языка. Лисп - довольно прост в освоении, есть много готового на нем тут, и на других форумах, в том числе англоязычных, но возможности ограничены. Например, из лиспа не подобраться к подшивке, не получить красивых, продвинутых диалоговых окон, но основные задачи по черчению, решаемые в Автокаде, ему доступны, в том числе различные расчеты, да и вообще можно давать волю фантазии. Главное самому понимать и формулировать задачи. Как раз сейчас тут идет бурное обсуждение по поводу выбора языка, советую почитать прежде чем начинать "погружение" ![]() |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Копирование, сортировка, переименование листов (layout) | VVA | Готовые программы | 115 | 28.03.2025 20:59 |
Печать в один PDF фаил нескольких листов | YuryKlimchuk | AutoCAD | 103 | 24.05.2018 20:47 |
Упорядочивание вкладок (листов) | Малюк | AutoCAD | 15 | 18.11.2015 17:03 |
Как собрать несколько DWF файлов в один | koks | AutoCAD | 7 | 24.06.2013 11:44 |
Как собрать несколько оформленных чертежей в один | E.D. | AutoCAD | 33 | 16.07.2009 09:42 |