|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Нумерация и позиционирование (дубль 2)
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 12235
|
|
||||
Вот к примеру две линии и Mtext, который их связывает.
В первой формуле есть указатель на объект №1, а во второй - указатель на объект №2. Если договориться, что первая формула - ведущая, а вторая - ведомая, то прочтя макросом первую формулу, мы и объект найдем и свойство прочтем, затем прочтя вторую формулу - мы ведомый объект найдем, его свойство и приведем в соответствие длинну второй линии с первой. |
||||
![]() |
|
||||
Проблема в том, что для каждого чертежа программу не напишешь. Взаимосвязи надо указать - это пожалуйста, алгоритм один и тот же как и для других чертежей. Макрос стандартный. Метить надо как-то такие связующие вещи, вот дин блок - идеальная для этого вещь. Можно и простым mtext-om пользоваться, только в начале надо значек условный ставить, чтобы такие штуки находились автоматом.
Есть что обсудить, короче. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А - идею понял, ну тогда наверно правильней создать таблицу - две колонки в левой свойства, правая значения и два лиспика - импорт + экспорт, идея хорошая надо Крыса вызывать - что скажет?
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Можно и три, и четыре и хоть до бесконечности количество элементов связывать друг с другом.
Добавлю: Причем копируя эту пару и связующий элемент взаимосвязь не рвется и в новой группе все работает на ура. Есть и к динамическим свойствам доступ через формулы, только надо делать обратный процесс увидя их их же и отрихтовать. Последний раз редактировалось Supermax, 12.12.2007 в 17:24. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
А чего меня звать, я и так гляжу за темой
![]() У меня сразу вопрос: вот, допустим, связали отрезки. Надо увеличить их длину. Какая вершина (или точка отрезка) остается "на месте"? Кто и как это определяет? ИМХО - бесполезная затея. Это же фактически просто дин.блок получится. Ну да, большой. Ну да, с неочевидными моментами. Но смысл?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Но опять-же в 3d ничерта так не сделать, да и не только в 3д - области полилинии только если их целиком передвинуть остальные поля типа площадь - read only!
p.s. Пока писал предыдущий пост появился - удобно в тех. случаях когда надо параметрически чего- нибудь большое задать, а в дин. блоках для этого 51 ручку потянуть надо, а здесь вбил и готово.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Я думал, что это я размахнулся, а это оказывается вы размахнулись, что я со своим размахом совсем потерялся.
Есть очень много мест, в которых меняя одно значение на другое все корректно происходит. Меняя например значение свойства Distance - мы изменяем длинну в дин блоках конкретно в нужную сторону. Текстом можно манипулировать, Если известно, как площадь или объем должен изменяться, то по изменению текста, обозначающего площадь, можно перемещать заранее обусловленные вещи на вычисленную длинну. В формуле можно написать столько всякой фигни, что и полилинию можно перестраивать и длины отрезкам менять с заданной точки и все, что угодно. Надо только условиться, что есть что и все. Кто макрос пишет, тот и диктует правила. В обществе людей с вывихнутыми на программировании мозгами это называется формат записи. Вот его давайте и обсудим. Бо перспектива дюже заманчивая. |
||||
![]() |
|
||||
Возьмем за основу простой Mtext.
Как макросу отличить этот объект от простых mtext-ов? Предлагаю в Hyperlink писать "Объект_связи" Выбираем все Mtext-ы с Хуперлинком "Объект_связи" Другой вариант - в начале строки текста писать ник создателя макроса. ![]() Далее, как в лиспе следует имя функции, то есть некий термин, предполагающий совершение конкретных действий. Можно имя функции написанной на лиспе. Точно! Именно так и надо. Далее аргументы для этой функции в виде чего угодно включая формулы с указанием на свойства конкретных объектов. Какая функция, такие ей и аргументы. Например: $Kpblc text->distance_line (формула с указанием на объект Text или Mtext и его свойство Contents) ( формула с указанием на объект и свойство Start или End) Cвойства Start и End содержат X, Y и Z координаты начала и конца линии. Если указан старт, то его функция пересчитывает на новое значение, взятое как производное от значения длинны из Contents текста и меняет старт, а если энд, то энд меняет. Вот так, метка, имя функции из библиотеки и аргументы этой функции в виде данных и/или указателей на объекты. Надо еще помнить, что в формулах можно считать, однако. Последний раз редактировалось Supermax, 12.12.2007 в 22:08. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Ты прав - в формате и есть вся проблема - я считаю вначале надо задачу поставить и цель - для чего этот код (формат) предназначен, а то, так до DFX дойдем - штука конечно хорошая, но все же хочется на более земном уровне автоматизацию получить. Главное по моему предусмотреть зависимость одного параметра от другого (то есть x=5, y=2*x-14), а потом результаты примитивам присваивать, скорее даже не примитивам присваивать, а действиям которые их создают (с предварительным удалением старых) - дабы можно было и в 3d залезть.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
В данном контексте (тот формат, что я предложил, по аналогии с форматом лиспа) все зависит от функции, которая и определяет состав дальнейшей записи. Надо ей три аргумента - пожалуйста, надо четыре - пожалуйста, надо просто коэффициент умноженный на данные свойства и т.п. - пожалуйста. 3D говоришь - да нет проблем. Кстати совершенно не обязательно указывать формулой именно доступные свойства, достаточно просто указатель на объект. А дальше написать название свойства к примеру.
Можно в скобках после метки писать функции и ее аргументы, так можно и несколько функций применять в одном указателе. Такой супер лисп забацать. |
||||
![]() |
|
||||
Последний аккорд на сегодня.
Надо макрос - регенератор, который всеголишь ищет по метке Mtext-ы указатели и запускает из библиотеки указанные в них функции, передавая им их аргументы из текста самого указателя. Ну а функции, оперирующие с созданием, или модификацией существующих примитивов - можно писать до бесконечности и все они лягут в отдельную библиотеку для пользователей. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Не мне кажеться здесь немножко другая задача, для каждой "детали" параметрический лисп писать это одно (про что я ксати много раз говорил в замену 3д дин. блоков) - идея хорошая, но в данном случае хочется сделать автоматизацию для пользователя (которую может юзер без лиспа создать), а лисп программы и без таблиц сами по себе неплохо работают.
P.S. Ну так в итоге формат будем придумывать или в сторону лисп, функций беседу продолжим.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Где-то близко к этой теме
http://www.sapracad.h.com.ua/
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Связь с примитивами можно осуществлять только по хендлам этих примитивов (ObjectID может меняться, по-моему). Соответственно необходим загруженный и быстро работающий код, который и будет выполнять, во-первых, "связку", а, во-вторых, определять реакции связанных примитивов.
Ну народ, ну сами-то подумайте об удобстве пользования! Ведь невозможно же будет! Сначала указать на "родителя" изменения, потом на того, кого надо будет менять, потом выбрать свойство изменяемого, потом отследить возможную некорректность ввода... Застрелиться!
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Kpblc, формула всегда зацеплена за объект не зависимо поменялся ObjectID или нет. Если он изменился у примитива, то автоматом меняется и в формуле.
Поскольку модель являет собой статический набор элементов, то после того, как запустилась функция изменения свойств элемента, этот элемент перестраивается и модель опять становится статичной. Вы можете снести связующие mtext-ы и ничего не развалится, просто в дальнейшем уже не изменится. Я еще раз для не внимательных напишу: Возьмите тройку ведомый объект, связующий объект и ведущий объект и скопируйте в сторонку сразу все, и вы увидите, что в новой тройке сохранилась взаимосвязь. О чем это говорит? О том, что формулы это не просто записи с указанием которые по ObjectID меняют свойства другого элемента. Скорее ObjectID просто демонстрация ориентации этой связи, а сама сцепка сделана намного глубже, иначе, как тогда такое могло бы происходить? В новой тройке новые ObjectID. Как и кто их туда вставил? Цитата:
Прочтя формулу, я выхожу на объект и вот тогда, я могу нырнуть в его свойства с любой меня интересующей стороны. Если изменить данный объект, то параметры в формуле изменятся только после регенерации модели. Поскольку наш продукт тоже своего рода регенератор, надо сначала регенерировать модель, чтобы привести все формулы в состояние достоверности, а потом по ним произвести видоизменение объектов. Не исключено, что эта пара действий должна повторятся в цикле несколько раз. Зацикливание тоже может появится, как и в лиспе. Любителям параметрического моделирования, а именно строительство объектов программным способом тоже есть где развернуться. Пишем функцию, аргументами которой является указатель на объект, к которому должна быть дорисована деталь и имя функции, которая строит эту деталь, в зависимости от параметров объекта, к которому она приделывается. Указателей на объект может быть несколько, в зависимости сколько надо из него вытащить свойств. Про возможность не корректного ввода - надо защищаться до определенного здравого смысла. Если пользователь ткнул не в тот элемент и указал не те свойства, то и гори его компьютер ярким пламенем! Если от случайного или не корректного ввода может вылететь фатал егор, то надо думать, а если просто модель покорежит, так откатом исправят. Никакие загруженные и быстоработающие коды не нужны. Это не динамический блок, а программно регенерируемая модель. Метка, функция и ее аргументы (любые и в любом количестве) Все в скобках, как в лиспе и даже можно лисп-функции туда писать типа (setq ddd ... и далее формула, указывающая на свойство какого-нибудь объекта. Все, что после имени функции, а она, как известно, сразу после открывающейся скобки и до пробела - считывается и загружается в переменную, которую читает вызванная из библиотеки функция и производит соответствующие манипуляции. Последний раз редактировалось Supermax, 13.12.2007 в 13:54. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Я дунувши слеганца, поэтому на возможную резкость прошу внимания обращать поменьше.
Теперь по делу: Объект надо каким-то образом идентифицировать. Я с этим делом воевал, когда пытался прописать командный реактор на копирование объектов (по некоторым условиям применение полей там невозможно было в принципе). Последовательность создания копируемых объектов не может быть однозначно предсказана. Поясню на примере: Ведущий объект имеет ID 1; связующий - 2; ведомый - 3 (беру простейший пример). Создали / посносили еще сотни 2-3 объектов. Копируем эту "тройку", и в результате запросто может получиться, что копия ведущего получит ID 301, связующего - 307, ведомого - 305. Или в любом ином порядке. И все потому, что придется создавать и модифицировать словарные записи, а там не все очевидно и предсказуемо. На поля можно не кивать, их работа обуславливается отдельным реактором, нарисованным на arx и автоматически подгружаемым AutoCAD'ом.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 25.12.2005
Москва
Сообщений: 13,626
|
"Если абстрагироваться от трудностей технической реализации, то в принципе можно себе представить..." ...как отрезок, сгруппированный с МТекстом, описывающим формулу неизвестно чего, вставляется в пустой чертеж с координатами 0,0,0. На этом проектирование можно закончить.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Дима_, это ты кого спрашивал?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Еще раз, и еще более разжевано, на гоблинский переведенное.
Мне допустим надо чтобы в выбранном мною динамическом блоке, смещался по встроенному в него направлению определенному параметром distance и Move Action? некий элемент на расстояние равное длинне дуги. Я использую стандартную функцию приравнивания параметров см. описание в файле Мне, короче, дали библиотеку, и я в ней нашел подходящую для меня функцию и вставил как в описании у нее написано в mtext. Надавил кнопку "дин. регенерация" и все стало нищак. Про какую идентификацию вы тут гутарите? Поле связано с объектом и его свойством намертво, что, прочесть на какой объет оно указывает не можете? Тогда сюда лезьте http://dwg.ru/f/showthread.php?p=187684#post187684 Если при стопервом копировании тетя клава заела, так и вешаться что ли? Выбераем короче все mtext-ы, из них все с меткой, читаем каждый и все, что после имени функции в переменную загоняем. Запускаем указанную функцию и она, прочев данные из переменной совершает требуемое действие, на которое она запрограммирована и ради которого созданна, а именно меняеят значение свойства одного объекта на значение полученное из свойства другого. Ничего больше выдумывать не надо. Весь формат на этом и надо ограничить. Лисп пишется в файле txt с расширением lsp, а здесь лисп пишется в mtext-е с меткой перед скобкой и в качестве аргументов могут быть и формулы и простые выражения. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Блин, я сейчас материться начну. Ты в поле ObjectID поменять поменяешь, но как ты определишь, к какому объекту оно будет относиться? Я ж не зря тут распинался.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Блин, я сейчас заплачу! Нафига мне менять ObjectID? Ты вообще меня не понимаешь что ли? Я по нему до примитива добираюсь, а меняю уже сам примитив лиспом. Любые его свойства. После прочтения формулы мне она уже не нужна. Связана она с каким-то объектом - ну и ладушки. Это аргумент функции, как указатель на объект и его свойство, блин!
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Поля это просто текст в формате (индетефикатор что это поле, id объекта, имя свойства и формат отображения свойства), Supermax предлагает использовать этот текст для хранения указателя на объект и его свойства + действия которые надо над ним совершить - повторяю вопрос еще раз, но более развернуто - если создан объект, потом совершенна куча операций в том числе и над ним - его id может изменится? Ответ на этот вопрос решает судьбу дальнейшей дискусии.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Твою дивизию... Не, ну ты что, собираешься эту связь в каждом файле, что ли, настраивать? С нуля, так? На фига оно такое надо-то?
А сильно хочется поизвращаться - ну добавь в объект ldata по типу того, что я на абоке показывал, потом читай и выполняй. Функция (eval) тебе поможет. Еще раз подчеркиваю - смысла в этой затее лично я не вижу никакого.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Я посмотрел id дуги, сохранил его, вышел в пространство модели, потянул ручку у дуги, то есть ее увеличил, регенерировал модель, изменились при этом показания в полях, вошел опять в редактирование поля и посмотрел id ObjId 2130318984 - первый раз
ObjId 2130318984 - второй раз. И третий и четвертый и десятый. не меняется. А вот после перезагрузки файла - другое значение, как в именах. |
||||
![]() |
|
||||
Kpblc, это способ связать в данном файле параметры нескольких элементов в нужном алгоритме не делая при этом специально для этого файла программ.
Ведь не только о взаимосвязи длин идет речь. Можно вычерчивать программно элементы опираясь на данные таблицы, свойства других элементов, менять динамические свойства дин. блоков в зависимости от текстовых данных, параметров других дин блоков. Я долго ломал голову как сместить болт, если у него шайбу другой толщины поставить. Вот самое оно как раз для этого. Берешь в болте делаешь move и управляешь им параметром толшина из шайбы. И связующий mtext можно прямо в болт, в атрибут вставить. Правда VVA там что-то про облом в этом плане изрекал, но разберемся. Надо пользователю связать несколько параметров, если написали для этого функцию - пожалуйста. И не надо на каждую функцию кнопку делать и прыгать по файлу как кузнечек. Одна единственная кнопка, которая запускает эти функции, читая их из mtext-a. |
||||
![]() |
|
||||
Да даже если бы id менялся, ничего страшного бы не было. Когда идет обработка - читается сначала формула (поле), затем по полученному id находится объект, видоизменяется и все. Повторное действо опять прочтетет id и если он уже другой, то оно найдет объет все равно, потому что это его id. Если бы я потянул ручку у дуги и id поменялся только в объекте, то формула бы перестала работать. Говорю, что они связаны на низком пренизком уровне, а id выбрасывают для наглядной агитации.
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
2 Supermax по твоему получается на каждую шайбу надо свое поле заводить - гемор, проще блок болта с шайбой создать - потом его поменял и все вхождения "подпрыгнули", так что либо твой пример не удачный, либо мы о разном говорим.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Цитата:
Все, что ты пытаешься сделать, ИМХО давно придумано и реализовано. Просто для этого надо брать не AutoCAD, а либо вертикальное решение на его основе (ADT | AA / MDT / ABS | MEP), либо вообще "уходить" в другие системы типа Revit, Inventor, SoliWorks, ProE, PTModeler etc.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
И не внимательно читаешь мои посты. #20 Цитата:
Реализация этого идиотизма настолько проста, что я и сам сделаю (когда-нибудь). Как сделаю - посмотрим насколько востребована. Последний раз редактировалось Supermax, 13.12.2007 в 17:07. |
||||
![]() |
|
||||
Kpblc, Если я скопирую только одну дугу, то и будет у меня одна дуга. какой в ней id уже не имеет значения. А вот если я дугу выделю и формулу, к ней привязанную, то скопировав, сразу пару, в этом новом поле будет id новой дуги. И ясно, что это будет уже не то id, что у дуги прототипа.
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Усложняем эксперимент. Сделай следующее: рисуется 2 отрезка, дуга (которую ты хочешь связать). Еще дуга, 3 отрезка и 2 полилинии. Поле на вторую дугу. _.copy, выделить один из отрезков, которые были отрисованы до дуги, дуга "простая", дуга "связанная", 2 отрезка "после", поле и 1 полилиния. Выделение выполнять именно в таком порядке.
Копирование выполнять 2 раза, внутри одной команды. Определи (лиспом) ID своих новых скопированных "связанных" объектов. Определение выполнять программно. Говорю сразу - лично мне не удалось это сделать. Для того, чтобы исключить всякие возможные толкования, код: Код:
P.S. Я специально скачал файлик, хотя и знал, что ничего принципиально нового там не увижу. Я тебе еще раз говорю: связб можно осуществлять между объектами либо по ObjectID (внутри одной сессии файла), либо по хендлам объектов (внутри одного файла). Даже если будет сделана эта функция на одно вхождение твоей формулы, она не будет работать на второе / третье / четвертое без капитальнейшего ломания мозгов. Dixi.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 13.12.2007 в 17:45. |
|||
![]() |
|
||||
Даже не вникая в детали, я тупо включаю ручку по очереди в каждом mtext-e и запускаю функцию VVA
(C:FLDVIZ) из поста #7 темы http://dwg.ru/f/showthread.php?p=187684#post187684 Котрая включает ручку у связанного с полем объекта. А после этого я могу да хоть на луну. Это, что касается id, который я даже и не видел. Правда у VVA надо строчку (setq txt (car(nentsel "\nУкажите объект с полем"))) поменять. типа (setq txt txt-i) Поскольку я в переменную txt буду сразу имя кидать и ручки включать тогда mtext-ам не надо. А переменную txt-i я уж сделаю. Последний раз редактировалось Supermax, 13.12.2007 в 18:31. |
||||
![]() |
|
||||
Добыл я из функции VVA все данные, так что и ручки включать не надо и так все в шоколаде выходит, а если вообще целевым назначением все делать, так просто будет как в эмиратах у эмира.
VVA, что молчишь? Я ж вижу, шныряешь туда, сюда, видать уже чего-то ваяешь? ![]() Я не зря тогда ту тему про поля затеял. Теперь вот пригодилось. Низкий тебе поклон за это. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Блин. Я говорю не про состояние поля, а про то, что тебе надо по новой получить указатели на красные дуги. Ты мой код запускал?
Возможно, я чего-то не понимаю, но, думаю, что сегодня мне это простительно.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
А именно красные и есть "связываемые". Если бы все было просто, все было бы уже давно решено.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
![]() Я запускаю макрос VVA, он включает ручки белым дугам, за ручки белые дуги подергал, формула отреагировала, а каким боком ты связал формулу с красными? Если бы ты в mtext вставил второе поле и в нем указал красную дугу, я бы понял. У меня в mtext-е два поля, одно указывает на один объект, другое на другой. Поскольку оба поля в одном mtext-e, то получается, что один объект связан с другим. Ладно, набирайся сил. ![]() Последний раз редактировалось Supermax, 14.12.2007 в 04:41. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
К примеру: Длина первой полилинии (которая, кстати, не попала в набор копирования) должна быть равной длине дуги. Полный механизм лично я придумать не смог.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Вот, наконец-то все стало на свои места. Красные дуги - побоку, на них поле ставить надо а на белые уже стоит, значит будем с белыми связывать. Добавляем еще одно поле в mtext с указанием в нем на полилинию и ее свойство... да любое, без разницы, но сразу за полем пишем буковками Vertex 1. У тебя получается четыре аргумента. Первый - указатель на объект "дуга" и ее свойство Length. Второй - указатель на элемент "полилиния" с любым установленным свойством. Третий - текст с именем свойства, которое надо уже выколупывать из найденного объекта лиспом, и четвертое - номер узла полилинии.
|
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Выложил здесь еще одну функцию, создающую поля в объекте. Но ценность ее в том, что там описываютя код поля и его значение. По поводу "чего молчишь ..." так 2 варианта
1. окончательно пока еще все не утряслось ни у меня ни у вас. 2. конец года, понимаешь.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
VVA, молоток!
Надо из всего этого многообразия склеить следующее: Есть mtext, в котором последовательно с разделителями пробел стоит метка $Kpblc (имя_функции аргумент1 аргумент2 аргумент_n) Надо эту строку прочесть и передать в соответствующую переменную. Поскольку макрос, который читает эту строку и запускает функции к самим функциям не имеет никакого отношения, то предлагаю переменную назвать также как и метку, только без доллара, но возможно с каким-нибудь префиксом. Чтобы тот, кто будет сочинять очередную функцию точно знал через какую переменную ему передадут параметры аргументов. Параметры предлагаю делать сразу списком, а не строкой. В список вставлять простой текст строками, значение полей сразу превращать в -1 код объекта и название свойства строкой. Получаются вполне читабельные данные для простого усвоения функцией. Я посмотрю на новую прогу и попробую вычленить из строки mtexta первое поле, второе поле и так далее. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Имя последнего отрисованного примитива
(value 0 (entget(entlast))) Если num-dxf код поля, ent - список dxf кодов, возвращаемый entget
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
В AddObjectField строку
(vl-position (value 0 EntData) '("MTEXT" "ATTRIB" "ATTDEF")) заменить на (vl-position (cdr(assoc 0 EntData)) '("MTEXT" "ATTRIB" "ATTDEF")) то от нее можно отказаться
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Есть, в посте №6
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Типа
(setq AddToEname (car (entsel "укажите MTEXT или ATTRIB или ATTDEF"))) (setq LinkObj (vlax-ename->vla-object (car (entsel)))) (setq PropName "length") Так? Последний раз редактировалось Supermax, 14.12.2007 в 11:52. |
||||
![]() |
|
||||
А это что? (vlax-get LinkObj PropName)
Нет такой функции у меня vlax-get . Может у него библиотека подгружена своя? вот vlax-get-propery есть. Но все равно не работает. Последний раз редактировалось Supermax, 14.12.2007 в 12:06. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
vlax-get - недокументированный способ получения определенного свойства activex-представления объекта. Официально не поддерживается и дальнейшая его судьба неизвестна (по информации, полученной от Полещука Н.Н. еще с год назад, если не больше).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
(vlax-get LinkObj "Length") это тоже, что и (vla-get-length Linkobj)
У меня тоже не работает. Буду разбираться почему, но позже. Там же выложил еще парочку набросков своих ф-ций и примеров их использования DEMO1 - сносит все поля в тексте DEMO2 - сносит поля AcVar (ссылающиеся на переменные) DEMO3 втавляет поле с текущей датой в текст
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Вскрыл я мозг тексту. Четыре словаря, вложенных друг в друга
Код:
В этом словаре далее идут указатели на словари первого поля и второго поля и в них уже указатели на объекты и заказнные в них свойства. Для скорости Цитата:
Последний раз редактировалось Supermax, 14.12.2007 в 13:42. |
||||
![]() |
|
||||
Пересмотрел принцип передачи аргументов функции из mtext. Найдя mtext и выявив в нем имя функции, макрос запускает эту функцию и передает ей -1 код с именем самого mtext-a. Переменную, куда стартовый макрос записывает -1 код для этой функции надо именовать также как и саму функцию с префиксом, скажем, @. Стартовых макросов может быть много и разных производителей. Метки тоже естественно будут разные. А вот имя переменной должно быть не зависимым от производителя стартового макроса. Поэтому я и предлагаю ее называть точно также как и саму функцию, только с префиксом @.
Чтобы не было написано дальше в теле mtext-a значения не имеет. Если функция требует или принимает целые лисп выражения в теле аргументов к ней, так она и прочитает, то, что ей нужно, а если ей много не надо, то значит и наворотов по распознавани. вложенных в аргументы подфункций не будет. Кому какие аргументы надо, тот и функцию пишет так, как хочет. Короче, в стартовом макросе не будет процедуры анализа текста с целью поиска указателей на объекты, нахождения гороха в мешке с гречкой и т.п. Нашли mtext по метке в начале строки, прочли имя функции, создали переменную с тем-же именем и сохранив в нее -1 код данного mtexta запустили функцию. |
||||
![]() |
|
||||
У меня такая радость, такая радость -заказчик приболел,
![]() что я, даже пофлудю немного. Я на свежую голову, перечитал всю тему с нуля и понял, что простому смертному в том, а что же тут делают не разобраться. Поэтому воскрешу и немного приукрашу суть затеи, ради которой открыта эта тема. Все знают, надеюсь, что такое макросы. Все знают, что ими можно чертить, считать, вычислять и управлять элементами чертежа. Правда, если макрос написан не под конкретные элементы и не имеет такой фишки, как "укажите на такой-то элемент", то он не может найти среди всех элементов вашего чертежа те, которые вы хотите с его помощью обработать. Он либо все элементы корежит, на которые заточен, либо вам надо вручную эти элементы выделять (правда это уже и есть эта фишка). Если элементов очень много, вы обречены постоянно выделять те элементы, которые надо этим макросом обрабатывать, или надо под этот, конкретный чертеж писать свой макрос, либо все элементы этого чертежа загружать в базу, с которой будет работать макрос. Задница, короче. Как простому юзеру привязать нужный элемент к нужному макросу при этом, не потеряв своей юзерской девственности? Вот так: Создаете mtext, в котром в начале пишете $Kpblc или другое ключевое слово, по которому стартовый макрос найдет данный mtext, пробел, открываете скобку, имя макроса, и дальше то, что от вас попросит создатель макроса. Это могут быть и просто цифровые или буквенные выражения и естественно поля. Какие поля с формулами или без вам тоже скажет создатель макроса. Например, зайдя в библиотеку макросов вы видете, что некий чел написал макрос, который изменяет параметр дин. блока в зависимости от длинны выбранной вами линии. В хелпе к этому макросу написано, что его имя (в смысле, макроса) например Lendh->Distance и после имени макроса надо указать полем на линию, затем пробел, затем полем на нужный блок и выбрать в нем нужное свойство, которое должно быть дистанцией. получится типа $Kpblc (Lendh->Distance 12345 91045) Я специально выбрал цвет, чтобы было понятно, что это поля. Вы помещаете этот mtext на край рабочего пространства, чтобы в чертеже не появился и дальше: Стартовый макрос - это такая программка, которую скоро можно будет от сюда скачать, которая находит эти специальные mtext-ы и запускает из конкретной папки, где вы храните макросы тот макрос, который вы хотите использовать по отношению к выбранным вами элементам. Стартовый макрос выносится на кнопку и выполняет функцию типа регенерации чертежа. Приводит в соответствие, так сказать, существующее с требуемым. Если что не понятно - спрашивайте. Последний раз редактировалось Supermax, 15.12.2007 в 16:11. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
На досуге немного "напрограммировал". Очень сырой примерчик установки длины отрезка(ов). Источником длины служат дуга, отрезок или круг, ссылки на которые прописаны в поле.
На запрос "Укажи текст-источник примитива" выбираем любой красный текст, на запрос "Укажи текст-приемник свойства" синий текст. Синий и фиолетовый отрезок "равняются" по длинне объекта, на который ссылается поле текста-источника. Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Так заказчики пока только у тебя болеют
![]()
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Ну, во первых ты не молоток, ты отбойный молоток!
Наконец-то хоть один человек просек, о чем я базарю. Только пару поправок: Во-первых надо все поля писать в одном mtext-e. Именно этим они и связываются в группу. Первое поле - ведущее, остальные - ведомые. Ну да ладно, надо все по человечески сделать. Главное наглядный пример, что все пашет, уже есть. Во-вторых - ты линии по длине только в 2D делаешь, а надо 3D. Но все равно, молодец, молодец, молодец! Постоянное "укажи то", да "укажи се" не катит никак. Тексты должны опознаваться автоматически, а значит, в них должна быть какая-то метка. Вот в строке в 2-ом dxf коде есть такая метка - это сочетание _%<\\ для опознания, что дальше идет имя объекта поля, а >%, то, что дальше описания поля нет. У нас я предлагал такую метку сделать как $Kpblc это типа подарка ему на день рождения. Но как тщательнее подумал, понял, что меток надо много, поскольку не всегда удобно корректировать все сразу. Поэтому возник вопрос, а где их держать? Вот ко мне пришел чужой чертеж, а там чужие метки. Сколько их и какие они я не знаю. По доллару в начале строки можно догадаться, что это метка. Может и два доллара надо ставить. А вот остальное надо по моему, хранить прямо в чертеже. Метки должны быть доступны к редактированию, дополнению и удалению. Вопрос открытый и я до конца его не доковырял. Второй вопрос - это последовательность запуска отдельных меченных mtext-ов. Предлагаю сразу за меткой ставить число, соответствующее очередности запуска данного связующего mtext-a. Оно не обязательно и его можно не ставить, если очередность не имет значения. типа $Kpblc 123 (имя функции ..... Если попались два одинаковых номера, то надо, либо останавливать работу, подсвечивать ручками оба mtext-а и выбрасывать сообщение, что они бракованные. Либо надо выбрать тот, кто был создан первый и запускать по приоритету старшинства. Кстати имя элемента несет в себе порядковый номер создания. Вопрос также - открытый. Третье - эти mtext-ы надо включать и выключать. В смысле видимости. Тогда их можно будет располагать рядом с элементами чертежа, что удобно для пользования. Ну это чистой воды сервис. Четыре - я передумал передавать функции -1 код текста. Надо взять строку типа: Код:
Код:
Именно функция уже и будет разбираться с этим словарем. Формула там, или объект - без разницы. Вот такой вот план. Последний раз редактировалось Supermax, 19.12.2007 в 11:59. |
||||
![]() |
|
||||
Добавлю:
Если взять простой текст и посмотреть на его свойства, то в них вы 360 пары не найдете. Но, как только вы перед текстом вставите %<\ а после >% с нажатием процентов весь текст превратится в поле, а в свойствах появится словарь. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
1. Все пишестя в 1 (м)тексте
2. Пока в 2D 3. Пока команда XX_TEST, а не ф-ция 3. Нужные тексты помечаются расширенными данными (далее РД) для выбора и дальнейшей обработки. Структура имени РД маска $DwgRu далее случайные уникальные числа. Команды для маркировки/демаркировки XX_Mark, XX_Del, XX_SEL присвоенное РД записывается в гиперссылку текста. Команда XX_TEST проходится по маркированным текстам, берет из них поля, причем первое поле - ведущее (берется примитив и его свойство), остальные - ведомые (берутся имена примитивов и пытаемся установить им св-во ведущего примитива). В прилагаемом примере после применения команда XX_TEST синий и зеленый отрезок уравняют длину с красным (источник - Текст1), и синий отрезок поменяет цвет на фиолетовый (источник Текст2)
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 20.12.2007 в 10:41. Причина: Добавлена ф-ция mip-conv-to-str |
|||
![]() |
|
||||
VVA, у меня ощущение, что я стал миллиардером, но сижу на раскаленной сковородке.
Почему ты не дискутируя по поводу метки, взял и ее впихнул в текст, да еще и в расширенные данные? Теперь, чтобы понять, кто меченый, а кто нет, надо постоянно подсвечивать твоей командой тексты. У меня задумка была "продлить" лисп. Сделать текст, или мтекст продолжением макроса, чтобы можно было писать лиспы сложной конфигурации, но чтобы в теле программы были поля. Для этого я и изголялся по поводу обработки строк с указателями на поля. Какой бы ты текст не написал (тра-ля-ля ...поле1 полеN (тра-ля-ля ... полеn)) все сведется к нормальному выражению, которое можно будет слизав из текста запустить в работу. Не губи перспективу!!! Умоляю!!! А так, круто и весьма впечатляет. Еще больше впечатлит, если текст начнет изменять длину (а не наоборот, как раньше) Можно даже текст в конце предложения сделать ведущим, только точку в разделителе вместо запятой надо автоматом подставлять. Сразу скажу, что если написать просто (функция - поля), то это для любого юзера понятно, но мне надо больше чем простым юзерам, да и многим тоже. От постановки задачи зависит все. Чуть в сторону и уже не тот результат. Юзеры будут использовать этот микроскоп как молоток, а мы как положено (как антураж великих умов). |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
К теме не очень относится, но раз уж спросил то ? в русской раскладке - alt+0136, в английской alt 0128 (нажимаешь alt, код на цифровой клавиатуре по очереди, отпускаеш).
P.S. особенно удобно на ноутбуках где цифровой клавиатуры нет, а как ее включить еще найти надо.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Ценно! Спасибо. Я вот тут произвел переучет своих ценностей и весьма сконфужен стал. Как мне быстро находить то, что мне понадобилось? Макросы множатся как тараканы. Скоро я просто не смогу в голове держать все, что у меня есть. А тут еще Kpblc мне свою библиотеку подкинул - КАРАУЛ! Жадность фраера сгубила, однозначно.
|
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Обновил лисп в #79. Теперь понимашь ценность библиотеки?
По поводу РД - считай это как предложение другого варианта. Нужные тексты пометил XX_MARK и они используются. Хотя не сложно сделать по некоей сигнатуре в тексте.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
По поводу РД я подумал, подумал и понял, что если оставить как есть, то никто мне не мешает написать в начале текста все, что в голову взбредет. Поэтому отличие текста-указателя от других текстов пользователь делает так, как ему заблагорассудится.
Немного муторно с маркировкой РД, но в принципе - сойдет. Ценность библиотеки я никогда не оспаривал. Я оспаривал применение ее, как части программы и взаимосвязанность функций в ней мне не нравится, а так - двумя руками за. VVA, Kpblc, я тут пытаюсь строку в список превратить не теряя уровня регистра букв и все, что я придумал сводится к следующему: Вот строка Код:
Я открываю файл с расширением .lsp и записываю в него эту строку. Затем этот файл запускаю. Если мне надо это выражение сохранить осуществляю сцепление строк Код:
кто-нибудь, когда-нибудь пытался сделать функцию строка->список? Последний раз редактировалось Supermax, 20.12.2007 в 12:29. |
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Если я правильно понял
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Нет, ты меня не понял, а я правильно не выразился.
Есть в активХ вещи чувствительные к регистру и они без кавычек. (read поганит эти функции и их аргументы если читает их из строки. Если в выражении появятся функции активХ, то будет труба. P.S. Маркировка заработала. Мне не понятно назначение кучи цифр. Это типа очередность будет ими определяться? |
||||
![]() |
|
||||
Забыл еще одну феньку сказать.
Если в атрибут блока, именно в пространстве редактора блока вставить поле и указать на любой выбранный элемент содержимого блока, а потом выйдя из редактора, запустив команду attsync и через свойства блока вставить в тот же атрибут втрое поле с указанием уже на элемент пространства модели, то мы тем самым свяжем элемент внутри блока с элементом снаружи. |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сквозная нумерация чертежей | Alxd | Прочее. Архитектура и строительство | 26 | 19.06.2024 09:01 |
Нумерация в МТекст | Bull | AutoCAD | 36 | 01.12.2022 14:24 |
Нумерация листов в AutoCad | Sergk | AutoCAD | 21 | 11.03.2022 05:21 |
Автоматическая нумерация текстов | dorofei | Программирование | 8 | 18.01.2007 09:31 |
Нумерация страниц в файлах | Димас | AutoCAD | 1 | 22.12.2005 10:31 |