Beispiel #1
0
        public List <BlockProps> GetBlockProperties()
        {
            //Функция возвращает список блоков с их атрибутами

            //Запускаем транзакцию
            Transaction tx = AcDb.TransactionManager.StartTransaction();

            //Находим таблицу описаний блоков
            BlockTable blkTbl = tx.GetObject(AcDb.BlockTableId, OpenMode.ForRead, false, true) as BlockTable;

            //Открываем таблицу записей текущего чертежа
            BlockTableRecord bt =
                (BlockTableRecord)tx.GetObject(
                    AcDb.CurrentSpaceId,
                    OpenMode.ForRead
                    );

            //Переменная списка блоков
            List <BlockProps> bNames = new List <BlockProps>();

            //Пример итерации по таблице определений блоков
            //https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/multipleattsync
            //Как я понимаю, здесь пробегается по всем таблицам записей,
            //в которых определения блоков не являются анонимными
            //и не являются листами
            foreach (BlockTableRecord btr in blkTbl.Cast <ObjectId>().Select(n =>
                                                                             (BlockTableRecord)tx.GetObject(n, OpenMode.ForRead, false))
                     .Where(n => !n.IsAnonymous && !n.IsLayout))
            {
                BlockProps bp = new BlockProps();

                bp.BlockId      = btr.ObjectId;
                bp.BlockName    = btr.Name;
                bp.Explodable   = btr.Explodable;
                bp.UniformScale = btr.BlockScaling;
                bNames.Add(bp);

                btr.Dispose();
            }
            ;
            tx.Commit();

            return(bNames);
        }
Beispiel #2
0
        public void SetBlockProperties(BlockProps OneBlock)
        {
            //Функция устанавливает свойства одного блока, которые передаются в виде аргумента

            {
                //ed.WriteMessage(String.Format("DEBUG: Changing {0} - {1} with E={2} and Uscale={3}",OneBlock.BlockId.ToString(), OneBlock.BlockName, OneBlock.Explodable, OneBlock.UniformScale.ToString()));

                //Начинаем транзакцию
                Transaction tx = AcDb.TransactionManager.StartTransaction();

                //Открываем таблицу описаний блоков на запись
                BlockTable blkTbl = tx.GetObject(AcDb.BlockTableId, OpenMode.ForWrite, false, true) as BlockTable;

                if (blkTbl.Has(OneBlock.BlockId)) //Если
                {
                    try
                    {
                        //Открываем текущий документ на запись
                        BlockTableRecord bt =
                            (BlockTableRecord)tx.GetObject(
                                AcDb.CurrentSpaceId,
                                OpenMode.ForWrite
                                );

                        //Пример итерации по таблице определений блоков
                        //https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/multipleattsync
                        //Как я понимаю, здесь пробегается по всем таблицам записей,
                        //в которых определения блоков не являются анонимными
                        //и не являются листами
                        foreach (BlockTableRecord btr in blkTbl.Cast <ObjectId>().Select(n =>
                                                                                         (BlockTableRecord)tx.GetObject(n, OpenMode.ForWrite, false))
                                 .Where(n => !n.IsAnonymous && !n.IsLayout))
                        {
                            if (btr.ObjectId == OneBlock.BlockId)  //Если нашли в таблице записей блок с нужным ObjectId
                            {
                                //То назначаем ему атрибуты
                                btr.Name         = OneBlock.BlockName;
                                btr.Explodable   = OneBlock.Explodable;
                                btr.BlockScaling = OneBlock.UniformScale;

                                ed.WriteMessage(String.Format("Изменен блок {1}", OneBlock.BlockId.ToString(), OneBlock.BlockName, OneBlock.Explodable, OneBlock.UniformScale.ToString()));

                                btr.Dispose();
                            }
                        }
                        ;

                        //Дальше необходимо "уведомить" все вставки блоков об изменении описания блока - пробегаем по чертежу
                        ObjectIdCollection brefIds = bt.GetBlockReferenceIds(true, true);
                        foreach (ObjectId id in brefIds)
                        {
                            BlockReference bl = tx.GetObject(id, OpenMode.ForWrite) as BlockReference;
                            bl.RecordGraphicsModified(true);
                        }
                    }
                    catch (PlatformDb.Runtime.Exception ex)
                    {
                        //Если что-то сломалось, то в командную строку выводится ошибка
                        ed.WriteMessage("Ошибка применения свойств: " + ex.Message);
                    };
                }
                tx.Commit();
            }
        }