MPolygon

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

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

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
MPolygon
« : 23-05-2014, 15:11:12 »
Добрый день!
Задача состоит в том, что бы получить Hatch из MPolygon
Код - C# [Выбрать]
  1. MPolygon plg = trans.GetObject(id, OpenMode.ForWrite, false) as AcDb.MPolygon;
  2. Hatch acHatch = plg.Hatch;
  3. BlockTblRec.AppendEntity(acHatch);
  4. trans.AddNewlyCreatedDBObject(acHatch, true);
  5.  
Ничего сложного и код отрабатывается без ошибок, но при закрытия чертежа "вылетает" Autocad с ошибкой



Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Re: MPolygon
« Ответ #1 : 23-05-2014, 15:19:34 »
OpenMode.ForRead...?

trans.Commit();

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: MPolygon
« Ответ #2 : 23-05-2014, 15:33:40 »
ForRead ничего не меняет
Транзакция подтверждается далее в коде

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: MPolygon
« Ответ #3 : 23-05-2014, 16:37:09 »
1. Версия AutoCAD, её разрядность, наличие SP.
2. Ошибка на любом MPolygon или на конкретном? Если на конкретном, то давай dwg-файл с этим MPolygon.
P.S.: В любом случае нужен чертеж с MPolygon для экспериментов, так что давай любой.
« Последнее редактирование: 23-05-2014, 16:49:46 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: MPolygon
« Ответ #4 : 23-05-2014, 16:57:52 »
Посмотрел в документацию. Метод Hatch класса MPolygon возвращает внутренний объект штриховки. Очень сомневаюсь, что его можно непосредственно добавлять в базу чертежа, т.к. очень вероятно, что этот объект по закрытии чертежа удаляется. Нужно добавлять его копию, т.е.:
Код - C# [Выбрать]
  1. Hatch acHatch = plg.Hatch.Clone();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: MPolygon
« Ответ #5 : 26-05-2014, 08:39:24 »
Спасибо!
Изменение кода всё исправило
Код - C# [Выбрать]
  1. Hatch acHatch = plg.Hatch.Clone() as Hatch;
Версии, разрядность и SP были ни при чем.
Где можно смотреть такие нюансы объектов?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: MPolygon
« Ответ #6 : 26-05-2014, 12:16:02 »
Где можно смотреть такие нюансы объектов?
В даном случае я смотрел в документации ObjectARX для "native" метода класса AcDbMpolygon, для которого .NET-класс MPolygon является оберткой.
Документация гласила следующее:
Цитировать
Returns a pointer to the AcDbMPolygon internal AcDbHatch member. The AcDbMPolygon uses the internal AcDbHatch member for rendering and other work.
Из этого я сделал вывод, что эта штриховка "живет" не больше одного сеанса работы с чертежом и если она нужна - нужно сделать её копию и работать с ней.


 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: MPolygon
« Ответ #7 : 03-06-2014, 23:53:13 »
Из этого я сделал вывод, что эта штриховка "живет" не больше одного сеанса работы с чертежом и если она нужна - нужно сделать её копию и работать с ней.
Насколько я вижу, автор в коде присваивает переменной Hatch ссылку на объект Hatch, полученный из Database и повторно пытается его же всунуть в Database, где он уже и так существует. Не удивительно, что возникает ошибка. И вполне логично, что Clone() отработает как полагается.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: MPolygon
« Ответ #8 : 04-06-2014, 00:47:01 »
Насколько я вижу, автор в коде присваивает переменной Hatch ссылку на объект Hatch, полученный из Database и повторно пытается его же всунуть в Database, где он уже и так существует.
Неа. Это MPolygon содержится в Database, а MPolygon.Hatch - это внутренняя штриховка, которая живет только пока Database открыт. Если бы Hatch уже была бы в Database, то у неё был бы свой собственный ObjectId и тогда метод BlockTblRec.AppendEntity(acHatch); не сработал бы сразу, а не возникла бы ошибка при закрытии чертежа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: MPolygon
« Ответ #9 : 04-06-2014, 07:43:41 »
Если бы Hatch уже была бы в Database, то у неё был бы свой собственный ObjectId и тогда метод BlockTblRec.AppendEntity(acHatch); не сработал бы сразу, а не возникла бы ошибка при закрытии чертежа.
Полагаю сие (красным) есть "очепятка". Про то, что ошибка возникает при закрытии, а не при сохранении в Database я, честно говоря, прозевал.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: MPolygon
« Ответ #10 : 04-06-2014, 09:08:32 »
Полагаю сие (красным) есть "очепятка".
Какая же это "очепятка". Если объект уже в базе, то вызов для него метода AppendEntity приводит к:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: MPolygon
« Ответ #11 : 04-06-2014, 09:58:45 »
Какая же это "очепятка".
С утра не проснулся и видимо поэтому неверно прочитал вашу конструкцию "не ... а не ...". :)