Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Andrey от 23-05-2014, 15:11:12

Название: MPolygon
Отправлено: Andrey от 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 с ошибкой

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs21.postimg.org%2Fbh8k4ej2b%2Ferror.jpg&hash=97b89fc74a29ad7abde001622e7b1ad7) (http://postimg.org/image/bh8k4ej2b/)
Название: Re: MPolygon
Отправлено: German от 23-05-2014, 15:19:34
OpenMode.ForRead...?

trans.Commit();
Название: Re: MPolygon
Отправлено: Andrey от 23-05-2014, 15:33:40
ForRead ничего не меняет
Транзакция подтверждается далее в коде
Название: Re: MPolygon
Отправлено: Александр Ривилис от 23-05-2014, 16:37:09
1. Версия AutoCAD, её разрядность, наличие SP.
2. Ошибка на любом MPolygon или на конкретном? Если на конкретном, то давай dwg-файл с этим MPolygon.
P.S.: В любом случае нужен чертеж с MPolygon для экспериментов, так что давай любой.
Название: Re: MPolygon
Отправлено: Александр Ривилис от 23-05-2014, 16:57:52
Посмотрел в документацию. Метод Hatch класса MPolygon возвращает внутренний объект штриховки. Очень сомневаюсь, что его можно непосредственно добавлять в базу чертежа, т.к. очень вероятно, что этот объект по закрытии чертежа удаляется. Нужно добавлять его копию, т.е.:
Код - C# [Выбрать]
  1. Hatch acHatch = plg.Hatch.Clone();
Название: Re: MPolygon
Отправлено: Andrey от 26-05-2014, 08:39:24
Спасибо!
Изменение кода всё исправило
Код - C# [Выбрать]
  1. Hatch acHatch = plg.Hatch.Clone() as Hatch;
Версии, разрядность и SP были ни при чем.
Где можно смотреть такие нюансы объектов?
Название: Re: MPolygon
Отправлено: Александр Ривилис от 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.
Из этого я сделал вывод, что эта штриховка "живет" не больше одного сеанса работы с чертежом и если она нужна - нужно сделать её копию и работать с ней.


 
Название: Re: MPolygon
Отправлено: Андрей Бушман от 03-06-2014, 23:53:13
Из этого я сделал вывод, что эта штриховка "живет" не больше одного сеанса работы с чертежом и если она нужна - нужно сделать её копию и работать с ней.
Насколько я вижу, автор в коде присваивает переменной Hatch ссылку на объект Hatch, полученный из Database и повторно пытается его же всунуть в Database, где он уже и так существует. Не удивительно, что возникает ошибка. И вполне логично, что Clone() отработает как полагается.
Название: Re: MPolygon
Отправлено: Александр Ривилис от 04-06-2014, 00:47:01
Насколько я вижу, автор в коде присваивает переменной Hatch ссылку на объект Hatch, полученный из Database и повторно пытается его же всунуть в Database, где он уже и так существует.
Неа. Это MPolygon содержится в Database, а MPolygon.Hatch - это внутренняя штриховка, которая живет только пока Database открыт. Если бы Hatch уже была бы в Database, то у неё был бы свой собственный ObjectId и тогда метод BlockTblRec.AppendEntity(acHatch); не сработал бы сразу, а не возникла бы ошибка при закрытии чертежа.
Название: Re: MPolygon
Отправлено: Андрей Бушман от 04-06-2014, 07:43:41
Если бы Hatch уже была бы в Database, то у неё был бы свой собственный ObjectId и тогда метод BlockTblRec.AppendEntity(acHatch); не сработал бы сразу, а не возникла бы ошибка при закрытии чертежа.
Полагаю сие (красным) есть "очепятка". Про то, что ошибка возникает при закрытии, а не при сохранении в Database я, честно говоря, прозевал.
Название: Re: MPolygon
Отправлено: Александр Ривилис от 04-06-2014, 09:08:32
Полагаю сие (красным) есть "очепятка".
Какая же это "очепятка". Если объект уже в базе, то вызов для него метода AppendEntity приводит к:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F9652%2F7842324.1%2F0_dafff_355d0a85_orig.png&hash=a275bd94be47bd01e07de7966570be24)
Название: Re: MPolygon
Отправлено: Андрей Бушман от 04-06-2014, 09:58:45
Какая же это "очепятка".
С утра не проснулся и видимо поэтому неверно прочитал вашу конструкцию "не ... а не ...". :)