21/10/2013
Изменение цвета вложенных примитивов AutoCAD с помощью .NET
Меня спрашивали как изменить цвет всех примитивов внутри блоков.
Следующий код использует рекурсивную вспомогательную функцию для итерирования внутри блоков, изменяющую цвет множества примитивов (не вставок блока – для них простая рекурсия):
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.Colors;
- namespace BlockTest
- {
- public class BlockCmds
- {
- [CommandMethod("CC")]
- public void ChangeColor()
- {
- Document doc =
- Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptIntegerResult pr =
- ed.GetInteger(
- "\nВведите индекс цвета для установки всем примитивам: "
- );
- if (pr.Status == PromptStatus.OK)
- {
- short newColorIndex = (short)pr.Value;
- ObjectId msId;
- Transaction tr =
- doc.TransactionManager.StartTransaction();
- using (tr)
- {
- BlockTable bt =
- (BlockTable)tr.GetObject(
- db.BlockTableId,
- OpenMode.ForRead
- );
- msId =
- bt[BlockTableRecord.ModelSpace];
- // Не обязательно, но быстрее чем прервать транзакцию
- tr.Commit();
- }
- int count =
- ChangeNestedEntitiesToColor(msId, newColorIndex);
- ed.Regen();
- ed.WriteMessage(
- "\nИзменено {0} примити{1} в цвет {2}.",
- count,
- count == 1 ? "в" : "вов",
- newColorIndex
- );
- }
- }
- private int ChangeNestedEntitiesToColor(
- ObjectId btrId, short colorIndex)
- {
- int changedCount = 0;
- Document doc =
- Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- Transaction tr =
- doc.TransactionManager.StartTransaction();
- using (tr)
- {
- BlockTableRecord btr =
- (BlockTableRecord)tr.GetObject(
- btrId,
- OpenMode.ForRead
- );
- foreach (ObjectId entId in btr)
- {
- Entity ent =
- tr.GetObject(entId, OpenMode.ForRead)
- as Entity;
- if (ent != null)
- {
- BlockReference br = ent as BlockReference;
- if (br != null)
- {
- // Рекурсивно для вложенных блоков
- changedCount +=
- ChangeNestedEntitiesToColor(
- br.BlockTableRecord,
- colorIndex
- );
- }
- else
- {
- if (ent.ColorIndex != colorIndex)
- {
- changedCount++;
- // Примитив открыт только для чтения – переключаем
- // в режим для записи
- ent.UpgradeOpen();
- ent.ColorIndex = colorIndex;
- ent.DowngradeOpen();
- }
- }
- }
- }
- tr.Commit();
- }
- return changedCount;
- }
- }
- }
Источник: http://through-the-interface.typepad.com/through_the_interface/2007/02/changing_the_co.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=275
Опубликовано 21.10.2013