Почему то удаляются все элементы кроме размеровА размеры полностью помещаются в рамку? Они попадают в набор выбора?
Почему то удаляются все элементы кроме размеровА размеры полностью помещаются в рамку? Они попадают в набор выбора?
Я не знаю попадают ли они в набор, но в заданных координатах они точно присутствуют.Проверь попадают ли они в набор.
valtur1983,
Ну и по стилю работы с AutoCAD. Это плохо:Код - C# [Выбрать]Это лучше:
foreach (ObjectId idsel in psel.Value.GetObjectIds()) { DBObject dbobj = tr.GetObject(idsel, OpenMode.ForRead) as DBObject; dbobj.UpgradeOpen(); dbobj.Erase(); }Код - C# [Выбрать]
foreach (ObjectId idsel in psel.Value.GetObjectIds()) { DBObject dbobj = tr.GetObject(idsel, OpenMode.ForWrite) as DBObject; if (dbobj != null) dbobj.Erase(); }
Я не знаю попадают ли они в набор, но в заданных координатах они точно присутствуют.Проверь попадают ли они в набор.
А как мне через код проверить что размеры попадают в выборДа хоть так:
Я не знаю попадают ли они в набор, но в заданных координатах они точно присутствуют.Проверь попадают ли они в набор.
А как мне через код проверить что размеры попадают в выбор. Вручную через отладку это проблематично.
valtur1983,
Не знаю почему у тебя проблемы именно с размерами. Что я точно вижу, так это то, что ты пытаешься смещать оригинальные объекты, а не копии в новом чертеже. А это ошибка. Кроме того WblockCloneObjects следует выполнять вне транзакции. Ты вот сдвинул оригинальные объекты, а транзакция еще не закрыта.
P.S.: Новые копии объектов ты можешь получить из IdMapping после WblockCloneObjects. Открываешь их на запись и затем смещаешь. Транзакция должна быть из новой базы.
Подскажите, в IdMapping, IdPair, куда копать, чтобы получить вставляемые объекты.idPair.Key - исходный объект, idPair.Value - копия объекта.
valtur1983,
Похоже ты пока не совсем понимаешь, что делаешь.
1. Что за вложенные транзакции?
2. При копировании копируются не только выбранные примитивы, но и связанные с ними объекты (слои, описания блоков, типы линий и т.д. и т.п). Ты должен проверять obj.Value на Entity и трансформировать только их.
3. Entity - это наследник DBObject. Поэтому преобразование (Entity)dbobj может не выполняться для слоёв, описаний блоков и т.д. Нужно проверять (dbobj as Entity) на null
Подскажите где можно внятно про эту тему почитать.Нигде. Только опыт.
Я думал, что можно использовать вложенные транзакции и ничего в этом плохого нет.Ничего хорошего в этом нет. Их следует использовать только в крайнем случае, когда без этого не обойтись.
Не пойму в чем отличия проверки obj.Value на Entity и (dbobj as Entity)!=null(Entity)dbobj вызывает исключение, если dbobj не Entity или его наследник. А (dbobj as Entity) не вызывает исключения, а становится равным null если dbobj не Entity или его наследник.
Ошибка вАга. Ну тут всё понятно. В данном случае ent не в ModelSpace, а в описании блока. Короче говоря тебе нужно проверять, что ent.OwnerId == destBt[BlockTableRecord.ModelSpace]
Код - C# [Выбрать]
ent.TransformBy(Matrix3d.Displacement(vec));
Autodesk.AutoCAD.Runtime.Exception: "eNotApplicable"
obj.Value Name=="AcDbBlockBegin"
Хотя не пойму почему проблема коснулась именно размеров, а все остальное нормально удалилось с чертежа.Сложный вопрос. Размеры - это сложные примитивы, которые порождают описание связанных с ним блоков. При удалении размеров должны удаляться и описания блоков. Если таблица блоков открыта для чтения, то это может мешать удалению блоков. Вот одна из возможных причин.