예제 #1
0
 /// <summary>
 /// Конструктор - основной (с параметрами)
 /// </summary>
 /// <param name="blockName">Наименование блока-владельца</param>
 /// <param name="name">Наименование сущности</param>
 public KEY_ENTITY(/*string blockName, */ Settings.MSExcel.COMMAND_ENTITY command, int indx, string name)
     : base(/*blockName, */ command, indx, name)
 {
     if (!(Valid < 0))
     {
         m_type             = MSExcel.GetTypeEntity(command);
         m_nameCreateMethod = MSExcel.GetNameCreateMethodEntity(command);
         m_nameSolidType    = MSExcel.GetNameSolidTypeEntity(command);
     }
     else
     {
         m_type              = Type.Missing as Type;
         m_nameCreateMethod  =
             m_nameSolidType =
                 string.Empty;
     }
 }
        /// <summary>
        /// Добавить примитив из коллекции
        /// </summary>
        /// <param name="blockName">Наименования блока - владельца прмитива</param>
        /// <param name="key">Ключ примитива из коллекции</param>
        protected void entityAdd(string blockName, KEY_ENTITY key)
        {
            Database         dbCurrent = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
            BlockTable       btCurrSpace;
            BlockTableRecord btrCurrent;
            ObjectId         oidBrecord
            , oidEntity;
            // для трансформации в исходное положение и извлесения значений параметров при создании примитива
            //Entity entityTransformCopy;

            string message = string.Format(@"Добавление примитива {0}, ИД={1}, имя={2}..."
                                           , MSExcel.GetEntityCtor(blockName, key).GetType().Name
                                           , key.Id
                                           , key.Name);

            try {
                using (Transaction trCurrent = dbCurrent.TransactionManager.StartTransaction()) {
                    // открываем таблицу блоков на запись
                    btCurrSpace = trCurrent.GetObject(dbCurrent.BlockTableId, OpenMode.ForWrite) as BlockTable;

                    if (blockName.Equals(string.Empty) == false)
                    {
                        // найти блок; при отсутствии создать
                        if (btCurrSpace.Has(blockName) == true)
                        {
                            // найден блок
                            //oidBrecord = btCurrSpace[MSExcel.s_dictEntity[key].m_BlockName];
                            btrCurrent = trCurrent.GetObject(btCurrSpace[blockName]
                                                             , OpenMode.ForWrite) as BlockTableRecord;
                        }
                        else
                        {
                            // создаем новое определение блока, задаем ему имя
                            btrCurrent      = new BlockTableRecord();
                            btrCurrent.Name = blockName;

                            // добавляем созданное определение блока в таблицу блоков, сохраняем его ID
                            //oidBrecord =
                            btCurrSpace.Add(btrCurrent);
                            // добавляем созданное определение блока в транзакцию
                            trCurrent.AddNewlyCreatedDBObject(btrCurrent, true);
                        }
                    }
                    else
                    {
                        btrCurrent = trCurrent.GetObject(dbCurrent.CurrentSpaceId
                                                         , OpenMode.ForWrite) as BlockTableRecord;
                    }

                    oidEntity = btrCurrent.AppendEntity(MSExcel.GetEntityCtor(blockName, key).m_entity);
                    trCurrent.AddNewlyCreatedDBObject(MSExcel.GetEntityCtor(blockName, key).m_entity as DBObject, true);

                    if (!(MSExcel.GetEntityCtor(blockName, key).m_ptDisplacement == Point3d.Origin))
                    {
                        MSExcel.GetEntityCtor(blockName, key).m_entity.TransformBy(
                            Matrix3d.Displacement(MSExcel.GetEntityCtor(blockName, key).m_ptDisplacement - Point3d.Origin)
                            );
                    }
                    else
                    {
                        ;
                    }

                    #region для трансформации в исходное положение и извлесения значений параметров при создании примитива
                    //if (MSExcel.s_dictEntity[key].m_entity is Solid3d)
                    //    acdictExt = ((Acad3DSolid)MSExcel.s_dictEntity[key].m_entity.AcadObject).GetExtensionDictionary();
                    //else
                    //    ;

                    //MSExcel.s_dictBlock[blockName].m_dictEntity[key].m_entity.TransformBy(Matrix3d.Rotation(1.57F, new Vector3d(0, 1, 0), Point3d.Origin));

                    //entityTransformCopy = MSExcel.s_dictBlock[blockName].m_dictEntity[key].m_entity.GetTransformedCopy(Matrix3d.PlaneToWorld(new Vector3d(0, 0, 1)));
                    #endregion

                    trCurrent.Commit();
                }

                Logging.AcEditorWriteMessage(message);
            } catch (System.Exception e) {
                Logging.AcEditorWriteException(e, message);

                Logging.ExceptionCaller(MethodBase.GetCurrentMethod(), e);
            }
        }
        //protected void export(string nameFileSettings, MSExcel.FORMAT format)
        //{
        //    // получаем текущий документ и его БД
        //    Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
        //    Database db = doc.Database;

        //    // начинаем транзакцию
        //    using (Transaction tr = db.TransactionManager.StartTransaction()) {
        //        // получаем ссылку на пространство модели (ModelSpace)
        //        // открываем таблицу блоков документа
        //        BlockTable acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

        //        // открываем пространство модели (Model Space) - оно является одной из записей в таблице блоков документа
        //        BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

        //        // "пробегаем" по всем объектам в пространстве модели
        //        foreach (ObjectId id in ms) {
        //            // приводим каждый из них к типу object
        //            object entity = (object)tr.GetObject(id, OpenMode.ForRead);

        //            MSExcel.AddToExport(entity);

        //            // выводим в консоль слой (entity.Layer), тип (entity.GetType().ToString()) и цвет (entity.Color) каждого объекта
        //            doc.Editor.WriteMessage(
        //                string.Format("\nПодготовлен для экспорта: слой:{0}; тип:{1}; цвет: [{2},{3},{4}]\n",
        //                    (entity is Entity ? entity as Entity : entity is Solid3d ? entity as Solid3d : null).Layer
        //                    , (entity is Entity ? entity as Entity : entity is Solid3d ? entity as Solid3d : null).GetType().ToString()
        //                    , (entity is Entity ? entity as Entity : entity is Solid3d ? entity as Solid3d : null).Color.Red.ToString()
        //                    , (entity is Entity ? entity as Entity : entity is Solid3d ? entity as Solid3d : null).Color.Green.ToString()
        //                    , (entity is Entity ? entity as Entity : entity is Solid3d ? entity as Solid3d : null).Color.Blue.ToString())
        //            );
        //        }

        //        tr.Commit();
        //    }

        //    MSExcel.Export(nameFileSettings, format);
        //}
        #endregion

        /// <summary>
        /// Добавить примитивы в блок из коллекции
        /// </summary>
        /// <param name="blockName">Наименования блока - владельца прмитива</param>
        protected void entitiesAdd(string blockName)
        {
            Database         dbCurrent = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
            BlockTable       btCurrSpace;
            BlockTableRecord btrCurrent;
            ObjectId         oidBrecord
            , oidEntity;
            // для трансформации в исходное положение и извлесения значений параметров при создании примитива
            //Entity entityTransformCopy;

            string message = string.Format(@"Добавление примитивов для блока {0}..."
                                           , blockName);

            try {
                using (Transaction trCurrent = dbCurrent.TransactionManager.StartTransaction()) {
                    // открываем таблицу блоков на запись
                    btCurrSpace = trCurrent.GetObject(dbCurrent.BlockTableId, OpenMode.ForWrite) as BlockTable;

                    if (blockName.Equals(string.Empty) == false)
                    {
                        // найти блок; при отсутствии создать
                        if (btCurrSpace.Has(blockName) == true)
                        {
                            // найден блок
                            //oidBrecord = btCurrSpace[MSExcel.s_dictEntity[key].m_BlockName];
                            btrCurrent = trCurrent.GetObject(btCurrSpace[blockName]
                                                             , OpenMode.ForWrite) as BlockTableRecord;
                        }
                        else
                        {
                            // создаем новое определение блока, задаем ему имя
                            btrCurrent      = new BlockTableRecord();
                            btrCurrent.Name = blockName;

                            // добавляем созданное определение блока в таблицу блоков, сохраняем его ID
                            //oidBrecord =
                            btCurrSpace.Add(btrCurrent);
                            // добавляем созданное определение блока в транзакцию
                            trCurrent.AddNewlyCreatedDBObject(btrCurrent, true);
                        }
                    }
                    else
                    {
                        btrCurrent = trCurrent.GetObject(dbCurrent.CurrentSpaceId
                                                         , OpenMode.ForWrite) as BlockTableRecord;
                    }

                    foreach (KEY_ENTITY key in MSExcel.GetBlock(blockName).Keys)
                    {
                        if (MSExcel.GetEntityCtor(blockName, key).m_entity.Id.IsValid == false)
                        {
                            oidEntity = btrCurrent.AppendEntity(MSExcel.GetEntityCtor(blockName, key).m_entity);
                            trCurrent.AddNewlyCreatedDBObject(MSExcel.GetEntityCtor(blockName, key).m_entity as DBObject, true);

                            if (!(MSExcel.GetEntityCtor(blockName, key).m_ptDisplacement == Point3d.Origin))
                            {
                                MSExcel.GetEntityCtor(blockName, key).m_entity.TransformBy(
                                    Matrix3d.Displacement(MSExcel.GetEntityCtor(blockName, key).m_ptDisplacement - Point3d.Origin)
                                    );
                            }
                            else
                            {
                                ;
                            }
                        }
                        else
                        {
                            ; // уже добавлен
                        }
                    }

                    trCurrent.Commit();
                }

                Logging.AcEditorWriteMessage(message);
            } catch (System.Exception e) {
                Logging.AcEditorWriteException(e, message);

                Logging.ExceptionCaller(MethodBase.GetCurrentMethod(), e);
            }
        }