REMOVEALLPROXY

Автор Тема: REMOVEALLPROXY  (Прочитано 94014 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: REMOVEALLPROXY
« Ответ #15 : 06-11-2014, 22:43:51 »
ну и спасибо тебе за то, что навёл меня на баг в моей версии. В версиях начиная с 2013 список масштабов в команде REMOVEALLPROXY не чистился. Причина банальная - перенос функции acedResetScaleList в accore.dll. Подправил свои исходники и выложил исправленные arx-файлы.
Александр, а можно сделать "финт ушами"? То есть сделать по 2 arx-модуля: с чисткой масштабов и без оной? Честно говоря, я был безумно рад, что запроса по чистке масштабов не стало...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #16 : 06-11-2014, 23:03:31 »
Данная функция для разбиения прокси на примитивы - значит если не получилось разбить то не стоит удалять, для этого есть другая функция.
Ага. С этой логикой я согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #17 : 06-11-2014, 23:06:43 »
Александр, а можно сделать "финт ушами"?
Запросто. Тем более что теперь на форуме выложены даже два варианта кода: и ObjectARX, и .NET API. Так что можешь для себя сделать любую сборку. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн T72Автор темы

  • ADN Club
  • Сообщений: 23
  • Карма: 4
Re: REMOVEALLPROXY
« Ответ #18 : 07-11-2014, 07:34:14 »
Эта конструкция в корне неправильна:
Код - C#: [Выделить]

    proxyEntity.Explode(aExplProxy);
    if (aExplProxy.Count > 0)
    {
        proxy++;
        proxyEntity.Erase(true);
     
        Line line = new Line();
        proxyEntity.HandOverTo(line, false, false);
        line.Close();
        line.Dispose();
    }

1. Ты сначала удаляешь  proxyEntity, и не проверив удачно ли это получилось выполняешь повторное удаление при помощи HandOverTo
2. После HandOverTo ты делаешь line.Close() - это правильно, т.к. теперь line - это примитив в базе. А где же line.Erase() ?
3. Нужно делать не line.Dispose(), а proxyEntity.Dispose()
Мы тут уже на форуме это обсуждали, что если объект/примитив AutoCAD содержится в базе (т.е. его ObjectId отличен от 0), то метод Dispose() для него эквивалентен методу Close(), а если примитив не содержится в базе (т.е. его ObjectId равен 0), то метод Dispose эквивалентен освобождению памяти этого примитива.
Таким образом  line.Close(); и  line.Dispose();  -  эквивалентны, зато нет освобождения памяти proxyEntity

Про эквивалентности и нюансы с памятью не знал, спасибо учту.
« Последнее редактирование: 07-11-2014, 09:36:32 от T72 »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #19 : 12-11-2014, 20:01:39 »
Александр, а можно сделать "финт ушами"? То есть сделать по 2 arx-модуля: с чисткой масштабов и без оной? Честно говоря, я был безумно рад, что запроса по чистке масштабов не стало...
Два варианта не нужны. Просто на уровне API нужно отделять мух от котлет: отдельные команды по работе с proxy и отдельные по работе со списком аннотативных масштабов. Затем различные комбинации этих методов заворачиваются в виде команд CAD системы. Т.е. отдельные команды для взрыва и удаления proxy и отдельная для очистки списка аннотативных масштабов.  Я себе это оформил в виде методов со следующими сигнатурами:

Код - C# [Выбрать]
  1. public static Db.ObjectIdCollection GetFreeAnnotativeScaleIds(Db.Database db);
  2.  
  3. public static void ClearAnnotativeScalesList(Db.Database db);
  4.  
  5. public static void GetProxyIds(Db.Database db, out Db.ObjectIdCollection proxyObjectIds, out Db.ObjectIdCollection proxyEntityIds, out Db.ObjectIdCollection proxyLockedLayerIds, Boolean unlockLayers);
  6.  
  7. public static void ExplodeAllProxy(Db.Database db, out StringBuilder sb);
  8.  
  9. public static ExplodeStatus ExplodeProxyInBTR(Db.ObjectId btrId, out Int64 proxy, out Int64 exploded);
  10.  
  11. public static void RemoveAllProxy(Db.Database db, out Int64 proxyNotEntityErased, out Int64 proxyEntityErased);
  12.  

P.S.
По коду Александра Наумовича завтра выложу замечания\вопросы. Код T72 мне не понравился, поэтому написал свою альтернативу. Выложу его после тестирования.

P.S.2
Кстати, список аннотативных масштабов я чищу "родными" средствами .NET API, не прибегая к вызову неуправляемых функций. Делаю это за счёт обработки контекста коллекции "ACDB_ANNOTATIONSCALES".

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #20 : 12-11-2014, 21:53:44 »
Зачем вы выполняете двойную проверку?

Код - C++ [Выбрать]
  1. for (__int64 i = iFirst; i < iLast && nObjects > 0; i++) {

разве не достаточно проверять i < iLast?

вы полагаете, что может оказаться существенная разница между разностью (iLast - iFirst) и значением nObjects и тем самым решили добавить дополнительную проверку, дабы максимально сократить цикл?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #21 : 12-11-2014, 22:46:17 »
вы полагаете, что может оказаться существенная разница между разностью (iLast - iFirst) и значением nObjects и тем самым решили добавить дополнительную проверку, дабы максимально сократить цикл?
Да. Я сталкивался с такой ситуацией несколько раз. Если мне не изменяет память я тебе рассказывал, что в изначальном коде iFirst был равен 0, но оказалось, что бывают чертежи у которых первая "живая" метка имеет очень большой номер и программа может очень длительное время перебирать метки (минутами, если не часами). Аналогично и с iLast. Достаточно просто сохранить чертеж в DXF-формате, изменить значение системной переменной $HANDSEED на какое-то очень большое и потом снова пересохранить в dwg-формат. Аналогичная ситуация возможна при получении чертежа из программ, которые генерируют DXF-файлы, если они не корректно вычисляют $HANDSEED.
« Последнее редактирование: 13-11-2014, 09:38:16 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #22 : 13-11-2014, 09:30:56 »
Код T72 мне не понравился
Что так? В основном T72 переводил мой код с C++ на C# (по мере возможности) без изменений. Мой код тоже не блещет изяществом. Первая версия его писалась > 15 лет назад и с годами просто адаптировалась к новым версиям без существенной переработки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #23 : 13-11-2014, 11:05:27 »
Что так? В основном T72 переводил мой код с C++ на C# (по мере возможности) без изменений.
Именно поэтому, ведь C# это всё же не C++.
Код - C++ [Выбрать]
  1. Мой код тоже не блещет изяществом.
Идеал вряд ли достижим. Тем не менее, к нему всегда стоит стремиться (имхо) :) Собственный вариант "переписи на C#" мне ближе в виду того, что он более похож на C#, чем на C++.
Цитата: Александр Ривилис
Если мне не изменяет память я тебе рассказывал...
Я такого не помню.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #24 : 13-11-2014, 12:24:43 »
На мой взгляд, конструкцию

Код - C++ [Выбрать]
  1. if (pProxy && (pProxy->graphicsMetafileType() == AcDbProxyEntity::kFullGraphics ||
  2.                            pProxy->graphicsMetafileType() == AcDbProxyEntity::kFullGraphics)) {
  3.                            
  4.   if (pProxy->graphicsMetafileType() == AcDbProxyEntity::kFullGraphics) {
  5.         ...
  6.   } else {
  7.         ...
  8.   }
  9. }

можно было бы заменить более компактным вариантом:

Код - C++ [Выбрать]
  1. if (pProxy && (pProxy->graphicsMetafileType() == AcDbProxyEntity::kFullGraphics) {                         
  2.         ...
  3. }
  4. else if (pProxy && (pProxy->graphicsMetafileType() == AcDbProxyEntity::kBoundingBox) {                     
  5.         ...
  6. }
« Последнее редактирование: 13-11-2014, 12:51:18 от Андрей Бушман »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #25 : 13-11-2014, 12:38:08 »
Я такого не помню.
Склероз у тебя. :-) Это было тогда, когда я поделился с тобой алгоритмом прохода по всем Handle в чертеже. Если помнишь, ты еще проверял какой из алгоритмов быстрее позволяет получить ObjectId по Handle. Были варианты: 1) Database.GetObjectId 2) P/Invoke для AcDbDatabase::getAcDbObjectId и 3) Database.TryGetObjectId - самый быстрый.
можно было бы заменить более компактным вариантом:
Он несколько компактнее по форме записи, но требует дополнительной проверки на неравенство нулю proxy в каждом операторе if. Так что тут дело вкуса. Тем более я не могу предугадать как этот код оптимизирует компилятор C++.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: REMOVEALLPROXY
« Ответ #26 : 13-11-2014, 12:48:00 »
требует дополнительной проверки на неравенство нулю proxy в каждом операторе if.
Но ведь вас не смутила двойная проверка на равенство AcDbProxyEntity::kFullGraphics. :)
Код - C++ [Выбрать]
  1. if(pProxy){
  2.         if (pProxy->graphicsMetafileType() == AcDbProxyEntity::kFullGraphics) {                        
  3.                         ...
  4.         }
  5.         else if (pProxy->graphicsMetafileType() == AcDbProxyEntity::kBoundingBox) {                    
  6.                         ...
  7.         }
  8. }
Цитировать
Это было тогда, когда я поделился с тобой алгоритмом прохода по всем Handle в чертеже. Если помнишь, ты еще проверял какой из алгоритмов быстрее позволяет получить ObjectId по Handle.
Я помню, что вы поделились, равно как и помню эти сравнения. Однако про дополнительную проверку за счёт уменьшения значения approxNumObjects() информации всё же не помню (возможно прослушал). Мой код, который вы упомянули, не использовал эту проверку (здесь, в коде строка 87).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #27 : 13-11-2014, 13:01:28 »
Однако про дополнительную проверку за счёт уменьшения значения approxNumObjects() информации всё же не помню (возможно прослушал).
Ты невнимательно прочитал. Я напоминал тебе про старый разговор о стартовом номере, т.е. что Handle нужно начинать не с 0, а с db.BlockTableId.Handle. Про конечный номер мы не тогда не говорили, но с ним аналогично - дополнительная проверка не помешает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: REMOVEALLPROXY
« Ответ #28 : 15-11-2014, 14:31:55 »
Ух начилось....
Где мой попкорн...
А давайте еще я свой вариант напишу - шутка не буду.
Александр, Андрей - я уверен что считать строки и байты - это немножко не ваш уровень.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: REMOVEALLPROXY
« Ответ #29 : 15-11-2014, 15:52:07 »
Александр, Андрей - я уверен что считать строки и байты - это немножко не ваш уровень.
Ты в данном случае про какие байты?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение