|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Вопрос на форуме уже поднимался, тему искать лениво (да и в отпуске я, так что звиняй
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Может дело вкуса, мне объектный реактор вполне удобен. Хотя и он не без недостатков. Например событие редактирования сложного объекта, например блока, состоящего из нескольких полилиний и атрибутов, срабатывает несколько раз. Он реагирует на изменение каждой вершины полилинии. И чем сложнее блок- тем больше будет срабатываний. Не придумал как прервать эту цепочку срабатываний после первой сработки. Я сейчас работаю с блоком не таким уж большим. Событие модификации срабатывает не более десятка раз. Код в обработчике совсем небольшой - поэтому меня это не сильно напрягает. Основной код в обработчике командного реактора - он вызывается всегда один раз. К слову о прерывании цепочки срабатываний. Выключение реактора в функции-обработчике - почему-то не помогает. Других вариантов прервать цепочку не придумал. Код:
blc - блок, на который вешаю объектный реактор, cs_ModifiedNode - глобальная переменная, в которой содержится ссылка на измененный блок cs_NodeEventsCounter - глобальный счетчик, подсчитывает количество раз срабатывания реактора |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Вот это вообще не проблема ИМХО. vl-remove и вперед
![]() После своих экспериментов с реакторами базы данных чертежа я предпочитаю более топорные методы ![]() Я бы делал по-другому. В глобальную переменную в начале редактирования засовываешь, к примеру, 0. В конце редактирования добавляешь 1. Если общее количество <= 1, то выполнять обработку. Нет - значит нет. Это тупо как идея, без реализации.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
это потому что в лиспе нет idle реактора, насколько помню) Это где уж гарантировано закончилась транзакция БД, и можно отцепить обработчики изменений и сделать что-то с объектом без опасения повторного вхождения в обработчики изменений.
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Ты не совсем понял проблему. Нет возможности в какой-либо момент времени влиять на работу реактора в момент срабатывания события редактирования. Автокад помечает объект как редактируемый столько раз, сколько параметров было изменено при редактировании - и вот столько раз и вызывает функцию-обработчик. То есть вот это - "Если общее количество <= 1" - просто негде вставить. Произошло 10 изменений в блоке при редактировании - значит 10 раз вызовется функция-обработчик. Отменить ее вызов - не получается.
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Думаешь, я просто так сказал про "топорные" подходы?
![]() ----- добавлено через ~1 мин. ----- А так - ну реально я бы смотрел в сторону MultiCAD, NET и пользовательских объектов.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Продолжаем про реакторы. Задача - при копировании объектов через буфер обмена нужно новые объекты включить в список владельцев реактора копирования (на самом деле еще и в список владельцев реактора изменения, но я это пока опустил для упрощения). Есть вот такой код:
Код:
P.S. При тестировании всего этого дела счетчик копирования у меня почему-то получает очень высокое значение - 43. ----- добавлено через ~24 мин. ----- Наверное действительно стоит добывать объекты через entlast. Последний раз редактировалось Сет, 06.08.2024 в 10:13. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Вот скажи, а на фига вообще объектный реактор-то?
Мне кажется, что, во-первых, не "при копировании", а "при завершении команды вставки из буфера обмена". Во-вторых, я не уверен, что твой код сработает при простом _.copy / _.mocoro. Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Для формирования списка копируемых объектов. Я пока не въехал вот в эту твою конструкцию, которая отвечает судя по всему за то же самое.
Код:
В моем случае объектный реактор легко формирует набор новых объектов. И проблема, которую я здесь обозначил, не в объектном реакторе, а в командном, там где я, собственно, обрабатываю команду COPY или PASTECLIP. С командой COPY нет проблем - она корректно обрабатывает мой список объектов, полученный в объектном реакторе. А вот PASTECLIP обрабатывается некорректно, потому что после окончания выполнения этой команды объекты еще не существуют - я не могу их обработать. Собственно тот же самый вопрос и к твоему коду. Обработав PASTECLIP ты оперируешь списком (*kpblc-ent-list*) реальных объектов или неких временных? Это твой реальных рабочий код или ты сейчас набросал его для пояснения своей мысли? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
А ты проверь. А заодно и посмотри на справку по функции entnext
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Проверил - работает.
Но во-первых я все равно не понял как работает entnext. В справке указано, что entnext возвращает следующий за указанным примитив в базе данных. Нигде не нашел оговорки, что речь идет о только что добавленных примитивах или что-то типа того. Хотя по факту так и работает. Во-вторых - entnext расчленяет составные объекты и считает их отдельно. А мне нужно, чтобы блок считался за один объект. Наверняка это как-то можно сделать? |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616
|
Цитата:
"Последним" вполне может оказаться не "цельный" объект (типа отрезка), а "составной" (типа полилинии или блока с атрибутами). Поэтому (entnext) будет возвращать не "свежедобавленный" объект, а подобъект от уже существующего в базе объекта. Я в своё время делал так - добавлял в чертеж "отрезок", запоминал его как (entlast), от него искал добавленные примитивы и затем удалял его. Разумеется, с обвесом в виде проверок и удаления этого отрезка по ERROR. Не слишком изящно, но это было очень давно, ещё до появления (vl-load-com) ... И оно работало вполне себе стабильно.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
просто у любого объекта в БД чертежа есть уникальный идентификатор (UID). В качестве этого UID используется целое число и при добавлении каждого следующего объекта в БД чертежа просто добавляют единицу к этому числу - это достаточно для уникальности. Соответственно, если взять в качестве "опорной точки" некий объект чертежа и получить его UID - то все добавленные после него объекты будут иметь больший по значению UID в порядке их добавления (но могут быть и пропуски при удаленных объектах).
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
--- И этот UID называется хэндлом (DXF группа 5, насколько помню). Последний раз редактировалось Сергей812, 06.08.2024 в 16:07. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
А фильтрация на что?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616
|
Так (entnext) идёт "вперёд" по базе данных.
Вызов (entnext) без параметра - первый примитив в базе. С параметром (entnext <имя_примитива>) - вперёд от указанного, включая субпримитивы. Пока база данных чертежа не закончится.
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
О какой фильтрации речь? Проверять каждый примитив не является ли он субпримитивом и его не добавлять в список? А что является признаком этого? В справке пишут, что как-то через SEQEND можно добраться до родительских примитивов, но пример бы посмотреть. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Ты специально не читаешь, да? )
Как пример: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |