Пример #1
0
        public void Replace()
        {
            ObjectId idBtrWin;

            if (dictIdBtrAkrWindow == null)
            {
                dictIdBtrAkrWindow = getBtrAkrWin(UtilsReplaceWindows.Db);
            }
            dictIdBtrAkrWindow.TryGetValue(TranslatorW.BlNameNew, out idBtrWin);

            if (idBtrWin.IsNull)
            {
                throw new Exception($"Ошибка, не найден блок окна {TranslatorW.BlNameNew}.");
            }

            // Создание вхождения нового блока окнак
            var blRefNew = new BlockReference(Position, idBtrWin);

            blRefNew.SetDatabaseDefaults();
            blRefNew.Layer = Settings.Default.LayerWindows;
            // добавление его в определение блок
            var btrOwner = IdBtrOwner.GetObject(OpenMode.ForWrite) as BlockTableRecord;

            btrOwner.AppendEntity(blRefNew);
            UtilsReplaceWindows.Transaction.AddNewlyCreatedDBObject(blRefNew, true);
            // Удаление старого блока.
            var blRefOldWin = IdBlRef.GetObject(OpenMode.ForWrite, false, true) as BlockReference;

            blRefOldWin.Erase();
        }
Пример #2
0
        // Замена вхождения блока СБ на АР
        public void ReplaceBlockSbToAr(MarkAr markAr, Transaction t, BlockTableRecord ms)
        {
            var blRefMarkSb  = t.GetObject(_idBlRefSb, OpenMode.ForWrite, false, true) as BlockReference;
            var blRefPanelAr = new BlockReference(blRefMarkSb.Position, markAr.IdBtrAr);

            blRefPanelAr.SetDatabaseDefaults();
            blRefPanelAr.Layer = blRefMarkSb.Layer;
            _extents           = blRefPanelAr.GeometricExtents;
            //_insPt = blRefPanelAr.Position;
            blRefMarkSb.Erase(true);
            _idBlRefAr = ms.AppendEntity(blRefPanelAr);
            t.AddNewlyCreatedDBObject(blRefPanelAr, true);

            //Database db = HostApplicationServices.WorkingDatabase;
            //using (var t = db.TransactionManager.StartTransaction())
            //{
            //   var ms = t.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite) as BlockTableRecord;
            //   var blRefMarkSb = t.GetObject(_idBlRefSb, OpenMode.ForWrite, false, true) as BlockReference;
            //   var blRefPanelAr = new BlockReference(blRefMarkSb.Position, markAr.IdBtrAr);
            //   blRefPanelAr.SetDatabaseDefaults();
            //   blRefPanelAr.Layer = blRefMarkSb.Layer;
            //   _extents = blRefPanelAr.GeometricExtents;
            //   //_insPt = blRefPanelAr.Position;
            //   blRefMarkSb.Erase(true);
            //   _idBlRefAr = ms.AppendEntity(blRefPanelAr);
            //   t.AddNewlyCreatedDBObject(blRefPanelAr, true);
            //   t.Commit();
            //}
        }
Пример #3
0
        protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
        {
            lock (Entities)
            {
                Entities.Clear();
                Entities.AddRange(_arrow.Explode().Select(x =>
                {
                    if (x is DBText)
                    {
                        return(_convertToAttribute((DBText)x));
                    }
                    return(x);
                }));

                ObjectId btrId = AcadBlocks.BlockTools.CreateBlockTableRecordEx(_insertPoint, "*U", Entities.Select(x => (Entity)x.Clone()).ToList(), AnnotativeStates.True);
                ObjectId brId  = AcadBlocks.BlockTools.AddBlockRefToModelSpace(btrId, null, _insertPoint, _ucs);

                Tools.StartTransaction(() =>
                {
                    BlockReference br = brId.GetObjectForWrite <BlockReference>();
                    br.SetDatabaseDefaults(HostApplicationServices.WorkingDatabase);
                    br.RecordGraphicsModified(true);

                    Entity inMemoryEntity = (Entity)br.Clone();
                    draw.Geometry.Draw(inMemoryEntity);

                    var btr = br.BlockTableRecord.GetObjectForWrite <BlockTableRecord>();
                    br.Erase();
                    btr.EraseBolckTableRecord();
                    inMemoryEntity.Dispose();
                });
            }

            return(true);
        }
Пример #4
0
        public void SaveToDatabase()
        {
            ObjectId btrId = AcadBlocks.BlockTools.CreateBlockTableRecordEx(_insertPoint, "*U", Entities, AnnotativeStates.True);
            ObjectId brId  = AcadBlocks.BlockTools.AddBlockRefToModelSpace(btrId, null, _insertPoint, _ucs);

            Tools.StartTransaction(() =>
            {
                BlockReference br = brId.GetObjectForWrite <BlockReference>();
                br.SetDatabaseDefaults(HostApplicationServices.WorkingDatabase);
                br.RecordGraphicsModified(true);

                var xrecord = CustomObjects.Helpers.XRecordTools.GetSetExtensionDictionaryEntry(br.Id, "ICmdFlag_WALLARROW_FLAG").GetObjectForRead <Xrecord>();
                xrecord.UpgradeOpen();

                //Point3d p = _jigPoint.TransformBy(Arrow.GetToLocalTransform(_lowerPointUcs, _ucs));
                Point3d p = _insertPoint;

                ResultBuffer rb = new ResultBuffer(
                    new TypedValue((int)DxfCode.Real, p.X),
                    new TypedValue((int)DxfCode.Real, p.Y),
                    new TypedValue((int)DxfCode.Real, p.Z)
                    );
                xrecord.Append(rb);

                _arrow.SerializeTo(br);
            });
        }
Пример #5
0
        public AcBlockRef AddBlockRef(Point3d pos, AcTransaction trans)
        {
            //Create the block reference...
            var blockRef = new BlockReference(pos, this.ObjectId);

            blockRef.SetDatabaseDefaults(); // Default/Active layer, color, ...
            trans.AddEntity(blockRef);      // Do it before blockRef.AttributeCollection.AppendAttribute(attRef);

            var attrRefs = new List <AttributeReference>();

            foreach (var attrDef in this.Attributes)
            {
                // this BlockDef could be initialized throught other (closed) Transaction, the same with this.Attributes
                var attDefObj = attrDef.GetAcObject(trans); // trans.GetObject<AttributeDefinition>(attrDef.ObjectId); //  attrDef.AcObject;
                var attRef    = new AttributeReference();
                attRef.SetAttributeFromBlock(attDefObj, blockRef.BlockTransform);
                attRef.SetDatabaseDefaults();

                if (!attDefObj.Constant)
                {
                    attRef.TextString = attDefObj.TextString;
                }

                blockRef.AttributeCollection.AppendAttribute(attRef);
                trans.AddNewlyCreatedDBObject(attRef, true);
                attrRefs.Add(attRef);
            }

            return(new AcBlockRef(blockRef, trans, attrRefs));
        }
Пример #6
0
        public static ObjectId AppendBlockItem(Point3d insertPoint, ObjectId blockTableRecordId,
                                               List <string> attrTextValues, Matrix3d toWcsTransform)
        {
            ObjectId resBlockId = ObjectId.Null;

            Tools.StartTransaction(() =>
            {
                Transaction trans = Tools.GetTopTransaction();

                // Add a block reference to the model space
                BlockTableRecord ms = Tools.GetAcadBlockTableRecordModelSpace(OpenMode.ForWrite);

                BlockTableRecord btr = blockTableRecordId.GetObjectForRead <BlockTableRecord>();

                BlockReference br = new BlockReference(insertPoint, blockTableRecordId);
                br.SetDatabaseDefaults();
                br.TransformBy(toWcsTransform);

                ObjectContextManager ocm    = btr.Database.ObjectContextManager;
                ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");

                if (btr.Annotative == AnnotativeStates.True)
                {
                    br.AddContext(occ.CurrentContext);
                }

                resBlockId = ms.AppendEntity(br);
                trans.AddNewlyCreatedDBObject(br, true);

                // Add attributes from the block table record
                List <AttributeDefinition> attributes = GetAttributes(btr, trans);
                int i = 0;
                foreach (AttributeDefinition acAtt in attributes)
                {
                    if (!acAtt.Constant)
                    {
                        using (AttributeReference acAttRef = new AttributeReference())
                        {
                            acAttRef.SetAttributeFromBlock(acAtt, br.BlockTransform);

                            if (attrTextValues != null)
                            {
                                acAttRef.TextString = attrTextValues[i++];
                            }
                            else
                            {
                                acAttRef.TextString = acAtt.TextString;
                            }

                            br.AttributeCollection.AppendAttribute(acAttRef);
                            trans.AddNewlyCreatedDBObject(acAttRef, true);
                        }
                    }
                }
                br.RecordGraphicsModified(true);
            });
            return(resBlockId);
        }
Пример #7
0
        private static void insertDesc(BlockReference blRefObr, Point3d ptDesc)
        {
            var blRefDesc = new BlockReference(ptDesc, idBtrDesc);

            blRefDesc.SetDatabaseDefaults();
            var btrObr = blRefObr.BlockTableRecord.GetObject(OpenMode.ForWrite) as BlockTableRecord;

            btrObr.AppendEntity(blRefDesc);
            t.AddNewlyCreatedDBObject(blRefDesc, true);
        }
Пример #8
0
        public static BlockReference CreateBlockReference(Database db, ObjectId blockId, Point3d insertionPoint, Scale3d scaleFactors, double rotation)
        {
            using (CurrentDB curr = new CurrentDB(db))
            {
                BlockReference blockRef = new BlockReference(insertionPoint, blockId);
                blockRef.SetDatabaseDefaults(db);

                blockRef.ScaleFactors = scaleFactors;
                blockRef.Rotation     = rotation;

                return(blockRef);
            }
        }
Пример #9
0
        public void InserirBlocoNoDesenho(string nomeArquivo)
        {
            Document acDoc     = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database currDwgDb = acDoc.Database;
            Editor   acDocEd   = acDoc.Editor;

            try
            {
                using (DocumentLock docLock = acDoc.LockDocument())
                {
                    using (Database xDb = new Database(false, true))
                    {
                        xDb.ReadDwgFile(nomeArquivo, System.IO.FileShare.Read, true, "");
                        using (Transaction tr = acDoc.TransactionManager.StartTransaction())
                        {
                            string   name = SymbolUtilityServices.GetBlockNameFromInsertPathName(nomeArquivo);
                            ObjectId id   = currDwgDb.Insert(name, xDb, true);

                            if (id.IsNull)
                            {
                                acDocEd.WriteMessage("Failed to insert block");
                                return;
                            }
                            BlockTableRecord   currSpace = (BlockTableRecord)(tr.GetObject(currDwgDb.CurrentSpaceId, OpenMode.ForWrite));
                            PromptPointResult  pPtRes;
                            PromptPointOptions pPtOpts = new PromptPointOptions("");
                            //Escolher o ponto de inserção
                            pPtOpts.Message = "\nEscolha o ponto de inserção do insumo: ";
                            pPtRes          = acDoc.Editor.GetPoint(pPtOpts);
                            Point3d            p3d    = pPtRes.Value;
                            CoordinateSystem3d coordS = new CoordinateSystem3d(p3d, currDwgDb.Ucsxdir, currDwgDb.Ucsydir);
                            BlockReference     insert = new BlockReference(p3d, id);
                            insert.Normal = coordS.Zaxis;
                            currSpace.AppendEntity(insert);
                            insert.SetDatabaseDefaults();
                            tr.AddNewlyCreatedDBObject(insert, true);
                            tr.Commit();
                        }
                    }
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                acDocEd.WriteMessage("\nError during copy: " + ex.Message);
            }
        }
Пример #10
0
        // создаение блока монтажки
        private void createBlock(List <ObjectId> idsEnt, string blName, Point3d location)
        {
            using (var t = _db.TransactionManager.StartTransaction())
            {
                var              bt = t.GetObject(_db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                ObjectId         idBtr;
                BlockTableRecord btr;
                // создание определения блока
                using (btr = new BlockTableRecord())
                {
                    btr.Name = blName;
                    idBtr    = bt.Add(btr);
                    t.AddNewlyCreatedDBObject(btr, true);
                }
                // копирование выбранных объектов в блок
                ObjectIdCollection ids     = new ObjectIdCollection(idsEnt.ToArray());
                IdMapping          mapping = new IdMapping();
                _db.DeepCloneObjects(ids, idBtr, mapping, false);

                // перемещение объектов в блоке
                btr = t.GetObject(idBtr, OpenMode.ForRead, false, true) as BlockTableRecord;
                var moveMatrix = Matrix3d.Displacement(Point3d.Origin - location);
                foreach (ObjectId idEnt in btr)
                {
                    var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
                    ent.TransformBy(moveMatrix);
                }

                // удаление выбранных объектов
                foreach (ObjectId idEnt in ids)
                {
                    var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
                    ent.Erase();
                }

                // вставка блока
                using (var blRef = new BlockReference(location, idBtr))
                {
                    blRef.SetDatabaseDefaults(_db);
                    var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                    ms.AppendEntity(blRef);
                    t.AddNewlyCreatedDBObject(blRef, true);
                }
                t.Commit();
            }
        }
Пример #11
0
        private void createBlock()
        {
            // создание определения блока
            using (var bt = CPS.DbExport.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable)
            {
                IdBtrEnd = getIdBtrEnd(bt);
            }

            // для каждой панели - копирование объектв торца с преобразование в координаты модели
            // список копируемых объектов торуа с привязкой к объекту блока панели для дальнейшего перемещения объектов в 0,0 в блоке торца
            foreach (var panelBlRef in itemLefEndsByY)
            {
                Dictionary<ObjectId, PanelBlRefExport> dictIdsEndEnts = new Dictionary<ObjectId, PanelBlRefExport>();
                if (isLeftSide)
                {
                    panelBlRef.PanelBtrExport.IdsEndsLeftEntity.ForEach(e => dictIdsEndEnts.Add(e, panelBlRef));
                }
                else
                {
                    panelBlRef.PanelBtrExport.IdsEndsRightEntity.ForEach(e => dictIdsEndEnts.Add(e, panelBlRef));
                }
                ObjectIdCollection ids = new ObjectIdCollection(dictIdsEndEnts.Keys.ToArray());
                using (IdMapping mapping = new IdMapping())
                {
                    CPS.DbExport.DeepCloneObjects(ids, IdBtrEnd, mapping, false);

                    //перемещение объектов в блоке
                    var moveMatrix = Matrix3d.Displacement(new Vector3d(0, panelBlRef.Position.Y - Position.Y, 0));
                    foreach (ObjectId id in ids)
                    {
                        var ent = mapping[id].Value.GetObject(OpenMode.ForWrite, false, true) as Entity;
                        ent.TransformBy(moveMatrix);
                    }
                }
            }

            // перемещение вех объектов торца в 0
            var btr = IdBtrEnd.GetObject(OpenMode.ForRead) as BlockTableRecord;
            Extents3d extFull = new Extents3d();
            extFull.AddBlockExtents(btr);
            foreach (ObjectId idEnt in btr)
            {
                using (var ent = idEnt.GetObject(OpenMode.ForWrite, false, true) as Entity)
                {
                    ent.TransformBy(Matrix3d.Displacement(new Vector3d(-extFull.MinPoint.X, 0, 0)));
                }
            }

            ////сопоставление скопированных объектов с панелями
            //Dictionary<ObjectId, PanelBlRefExport> dictIdsCopyedEndEnts = new Dictionary<ObjectId, PanelBlRefExport>();
            //foreach (IdPair itemIdMap in mapping)
            //{
            //   var panelBlRef = dictIdsEndEnts[itemIdMap.Key];
            //   dictIdsCopyedEndEnts.Add(itemIdMap.Key, panelBlRef);
            //}

            //// удаление выбранных объектов
            //foreach (ObjectId idEnt in ids)
            //{
            //   var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
            //   ent.Erase();
            //}

            // вставка блока
            if (!IsExistsBlockEnd)
            {
                using (var blRef = new BlockReference(Position, IdBtrEnd))
                {
                    blRef.SetDatabaseDefaults(CPS.DbExport);
                    using (var ms = SymbolUtilityServices.GetBlockModelSpaceId(CPS.DbExport).GetObject(OpenMode.ForWrite) as BlockTableRecord)
                    {
                        ms.AppendEntity(blRef);
                        ms.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(blRef, true);
                    }
                }
            }
        }
Пример #12
0
        // Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ
        public static void ResetBlocks()
        {
            // Для покраски панелей, нужно, чтобы в чертеже были расставлены блоки панелей Марки СБ.
            // Поэтому, при изменении зон покраски, перед повторным запуском команды покраски панелей и создания альбома,
            // нужно восстановить блоки Марки СБ (вместо Марок АР).
            // Блоки панелей Марки АР - удалить.

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (var t = db.TransactionManager.StartTransaction())
            {
                var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;

                var checkedBlocks = new HashSet<string>();

                foreach (ObjectId idEnt in ms)
                {
                    if (idEnt.ObjectClass.Name == "AcDbBlockReference")
                    {
                        var blRef = t.GetObject(idEnt, OpenMode.ForRead, false, true) as BlockReference;
                        if (MarkSb.IsBlockNamePanel(blRef.Name))
                        {
                            // Если это панель марки АР, то заменяем на панель марки СБ.
                            if (MarkSb.IsBlockNamePanelMarkAr(blRef.Name))
                            {
                                string markSb = MarkSb.GetMarkSbName(blRef.Name);// может быть с суффиксом торца _тп или _тл
                                string markSbBlName = MarkSb.GetMarkSbBlockName(markSb);// может быть с суффиксом торца _тп или _тл
                                if (!bt.Has(markSbBlName))
                                {
                                    // Нет определения блока марки СБ.
                                    // Такое возможно, если после покраски панелей, сделать очистку чертежа (блоки марки СБ удалятся).
                                    MarkSb.CreateBlockMarkSbFromAr(blRef.BlockTableRecord, markSbBlName);
                                    string errMsg = "\nНет определения блока для панели Марки СБ " + markSbBlName +
                                                   ". Оно создано из панели Марки АР " + blRef.Name +
                                                   ". Если внутри блока Марки СБ были зоны покраски, то в блоке Марки АР они были удалены." +
                                                   "Необходимо проверить блоки и заново запустить программу.";
                                    ed.WriteMessage("\n" + errMsg);
                                    // Надо чтобы проектировщик проверил эти блоки, может в них нужно добавить зоны покраски (т.к. в блоках марки АР их нет).
                                }
                                var idBtrMarkSb = bt[markSbBlName];
                                var blRefMarkSb = new BlockReference(blRef.Position, idBtrMarkSb);
                                blRefMarkSb.SetDatabaseDefaults();
                                blRefMarkSb.Layer = blRef.Layer;
                                ms.UpgradeOpen();
                                ms.AppendEntity(blRefMarkSb);
                                t.AddNewlyCreatedDBObject(blRefMarkSb, true);
                                // Перенос плитки на слой "АР_Плитка"
                                if (checkedBlocks.Add(markSbBlName))
                                {
                                    Tile.TilesNormalize(idBtrMarkSb);
                                }
                            }
                            // Перенос плитки на слой "АР_Плитка"
                            if (checkedBlocks.Add(blRef.Name))
                            {
                                Tile.TilesNormalize(blRef.BlockTableRecord);
                            }
                        }
                    }
                }
                Caption captionPanels = new Caption(db);
                // Удаление определений блоков Марок АР.
                foreach (ObjectId idBtr in bt)
                {
                    var btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
                    if (MarkSb.IsBlockNamePanel(btr.Name))
                    {
                        // Если это блок панели Марки АР
                        if (MarkSb.IsBlockNamePanelMarkAr(btr.Name))
                        {
                            // Удаление всех вхожденний бллока
                            var idsBlRef = btr.GetBlockReferenceIds(true, true);
                            foreach (ObjectId idBlRef in idsBlRef)
                            {
                                var blRef = t.GetObject(idBlRef, OpenMode.ForWrite, false, true) as BlockReference;
                                blRef.Erase(true);
                            }
                            // Удаление определение блока Марки АР
                            btr.UpgradeOpen();
                            btr.Erase(true);
                        }
                        else
                        {
                            // Подпись марки блока
                            string panelMark = btr.Name.Substring(Settings.Default.BlockPanelAkrPrefixName.Length);
                            captionPanels.AddMarkToPanelBtr(panelMark, idBtr);
                        }
                    }
                }
                t.Commit();
            }
        }
Пример #13
0
        private void createBlock()
        {
            // создание определения блока
            var bt = CPS.DbExport.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

            IdBtrEnd = getIdBtrEnd(bt);

            // для каждой панели - копирование объектв торца с преобразование в координаты модели
            // список копируемых объектов торуа с привязкой к объекту блока панели для дальнейшего перемещения объектов в 0,0 в блоке торца
            foreach (var panelBlRef in itemLefEndsByY)
            {
                var dictIdsEndEnts = new Dictionary <ObjectId, PanelBlRefExport>();
                if (isLeftSide)
                {
                    panelBlRef.PanelBtrExport.IdsEndsLeftEntity.ForEach(e => {
                        if (e.ObjectClass.Name == "AcDbBlockReference")
                        {
                            dictIdsEndEnts.Add(e, panelBlRef);
                        }
                    });
                }
                else
                {
                    panelBlRef.PanelBtrExport.IdsEndsRightEntity.ForEach(e =>
                    {
                        if (e.ObjectClass.Name == "AcDbBlockReference")
                        {
                            dictIdsEndEnts.Add(e, panelBlRef);
                        }
                    });
                }
                var ids = new ObjectIdCollection(dictIdsEndEnts.Keys.ToArray());
                using (IdMapping mapping = new IdMapping())
                {
                    CPS.DbExport.DeepCloneObjects(ids, IdBtrEnd, mapping, false);

                    //перемещение объектов в блоке
                    var moveMatrix = Matrix3d.Displacement(new Vector3d(0, panelBlRef.Position.Y - Position.Y, 0));
                    foreach (ObjectId id in ids)
                    {
                        var ent = mapping[id].Value.GetObject(OpenMode.ForWrite, false, true) as Entity;
                        ent.TransformBy(moveMatrix);
                    }
                }
            }

            // перемещение вех объектов торца в 0
            var btrEnd  = IdBtrEnd.GetObject(OpenMode.ForRead) as BlockTableRecord;
            var extFull = new Extents3d();

            extFull.AddBlockExtents(btrEnd);
            var tiles = new List <BlockReference>();

            foreach (ObjectId idEnt in btrEnd)
            {
                var ent = idEnt.GetObject(OpenMode.ForWrite, false, true) as Entity;
                ent.TransformBy(Matrix3d.Displacement(new Vector3d(-extFull.MinPoint.X, 0, 0)));
                if (ent is BlockReference)
                {
                    var blRefTile = ent as BlockReference;
                    var blName    = blRefTile.GetEffectiveName();
                    if (blName.Equals(Settings.Default.BlockTileName, StringComparison.OrdinalIgnoreCase))
                    {
                        tiles.Add(blRefTile);
                    }
                }
            }
            // Выравнивание блоков плиток
            if (tiles.Any())
            {
                var xTile = tiles.First().Position.X;
                foreach (var item in tiles)
                {
                    if (item.Position.X != xTile)
                    {
                        item.UpgradeOpen();
                        var moveMatrixTileX = Matrix3d.Displacement(new Vector3d(xTile - item.Position.X, 0, 0));
                        item.TransformBy(moveMatrixTileX);
                    }
                }
            }

            ////сопоставление скопированных объектов с панелями
            //Dictionary<ObjectId, PanelBlRefExport> dictIdsCopyedEndEnts = new Dictionary<ObjectId, PanelBlRefExport>();
            //foreach (IdPair itemIdMap in mapping)
            //{
            //   var panelBlRef = dictIdsEndEnts[itemIdMap.Key];
            //   dictIdsCopyedEndEnts.Add(itemIdMap.Key, panelBlRef);
            //}

            //// удаление выбранных объектов
            //foreach (ObjectId idEnt in ids)
            //{
            //   var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
            //   ent.Erase();
            //}

            // вставка блока
            if (!IsExistsBlockEnd)
            {
                using (var blRef = new BlockReference(Position, IdBtrEnd))
                {
                    blRef.SetDatabaseDefaults(CPS.DbExport);
                    using (var ms = SymbolUtilityServices.GetBlockModelSpaceId(CPS.DbExport).GetObject(OpenMode.ForWrite) as BlockTableRecord)
                    {
                        ms.AppendEntity(blRef);
                        ms.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(blRef, true);
                    }
                }
            }
        }
Пример #14
0
        /// <summary>
        /// Вставка блока в чертеж - интерактивная (BlockInsertJig)
        /// </summary>
        public static ObjectId Insert(string blName, LayerInfo?layer, List <Property>?props, bool explode = false)
        {
            var doc = Application.DocumentManager.MdiActiveDocument;

            if (doc == null)
            {
                return(ObjectId.Null);
            }
            var db = doc.Database;
            var ed = doc.Editor;

            using var @lock = doc.LockDocument();
            using var t     = db.TransactionManager.StartTransaction();
            var bt = (BlockTable)t.GetObject(db.BlockTableId, OpenMode.ForRead);

            if (!bt.Has(blName))
            {
                throw new Exception("Блок не определен в чертеже " + blName);
            }

            var idBlBtr = bt[blName];
            var pt      = Point3d.Origin;
            var br      = new BlockReference(pt, idBlBtr);

            br.SetDatabaseDefaults();

            if (layer != null)
            {
                layer.CheckLayerState();
                br.Layer = layer.Name;
            }

            var spaceBtr      = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
            var idBlRefInsert = spaceBtr.AppendEntity(br);

            t.AddNewlyCreatedDBObject(br, true);

            if (props != null && br.IsDynamicBlock)
            {
                foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection)
                {
                    var prop = props.FirstOrDefault(p =>
                                                    p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase));
                    if (prop != null)
                    {
                        try
                        {
                            item.Value = prop.Value;
                        }
                        catch (Exception ex)
                        {
                            Logger.Log.Error(ex,
                                             msg: $"Ошибка типа значения для дин параметра '{item.PropertyName}' " +
                                             $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " +
                                             $"а должен быть тип '{item.UnitsType}'");
                        }
                    }
                }
            }

            // jig
            var entJig = new Jigs.BlockInsertJig(br);
            var pr     = ed.Drag(entJig);

            if (pr.Status == PromptStatus.OK)
            {
                var btrBl = (BlockTableRecord)t.GetObject(idBlBtr, OpenMode.ForRead);
                if (btrBl.HasAttributeDefinitions)
                {
                    AddAttributes(br, btrBl, t);
                }
                if (explode)
                {
                    var owner = br.BlockId.GetObject <BlockTableRecord>(OpenMode.ForWrite);
                    using var explodes = new DBObjectCollection();
                    br.Explode(explodes);
                    foreach (Entity ent in explodes)
                    {
                        owner.AppendEntity(ent);
                        t.AddNewlyCreatedDBObject(ent, true);
                        ent.Layer = br.Layer;
                    }

                    br.Erase();
                }
            }
            else
            {
                br.Erase();
                idBlRefInsert = ObjectId.Null;
            }

            t.Commit();

            return(idBlRefInsert);
        }
Пример #15
0
        public void DrawGroupLeader()
        {
            Editor ed = dwg.Editor;
            PromptEntityOptions prmtEntityOpts = new PromptEntityOptions("Укажите линию");
            prmtEntityOpts.AllowNone = false;
            prmtEntityOpts.SetRejectMessage("Должна быть линия или полилиния!");
            prmtEntityOpts.AddAllowedClass(typeof(Line), true);
            prmtEntityOpts.AddAllowedClass(typeof(Polyline), true);
            PromptEntityResult entRes = ed.GetEntity(prmtEntityOpts);
            if (entRes.Status!= PromptStatus.OK)
            {
                return;
            }
            using (Transaction tr = CurrentDatabase.TransactionManager.StartTransaction())
            {
                GroupsInformation groupEntities = new GroupsInformation(tr, CurrentDatabase);
                List<string> groupList = groupEntities.GetGroupsOfObject(entRes.ObjectId);
                if (groupList == null)
                {
                    ed.WriteMessage("За указанным объектом не значится никаких групп!");
                    return;
                }
                PromptPointOptions pointOpts = new PromptPointOptions("\nУкажите точку вставки блока: ");
                PromptPointResult pointRes = ed.GetPoint(pointOpts);
                if (pointRes.Status!= PromptStatus.OK)
                {
                    return;
                }
                BlockTable bt = (BlockTable)CurrentDatabase.BlockTableId.GetObject(OpenMode.ForRead);
                BlockTableRecord btrSpace = (BlockTableRecord)CurrentDatabase.CurrentSpaceId
                    .GetObject(OpenMode.ForWrite);
                if (!bt.Has("group_vinoska"))
                {
                    ed.WriteMessage("\nВ файле не определён блок выноски!!");
                    return;
                }
                BlockTableRecord gleaderBtr = (BlockTableRecord)bt["group_vinoska"].GetObject(OpenMode.ForRead);
                BlockReference gleader = new BlockReference(pointRes.Value, gleaderBtr.ObjectId);
                btrSpace.AppendEntity(gleader);
                tr.AddNewlyCreatedDBObject(gleader, true);

                //Если блок аннотативный - добавляем в таблицу аннотативных масштабов блока текущий масштаб
                ObjectContextManager ocm = CurrentDatabase.ObjectContextManager;
                ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
                if (gleaderBtr.Annotative == AnnotativeStates.True)
                {
                    ObjectContexts.AddContext(gleader, occ.CurrentContext);
                }

                gleader.SetDatabaseDefaults();
                if (gleaderBtr.HasAttributeDefinitions)
                {
                    var attDefs = gleaderBtr.Cast<ObjectId>()
                        .Where(n => n.ObjectClass.Name == "AcDbAttributeDefinition")
                        .Select(n => (AttributeDefinition)n.GetObject(OpenMode.ForRead));
                    foreach (AttributeDefinition attdef in attDefs)
                    {
                        AttributeReference attref = new AttributeReference();
                        attref.SetAttributeFromBlock(attdef, gleader.BlockTransform);
                        gleader.AttributeCollection.AppendAttribute(attref);
                        tr.AddNewlyCreatedDBObject(attref, true);
                        if (gleaderBtr.Annotative == AnnotativeStates.True)
                        {
                            ObjectContexts.AddContext(attref, occ.CurrentContext);
                        }
                        int attCount = int.Parse(attref.Tag.Remove(0,10));
                        if (attCount<=groupList.Count)
                        {
                            attref.TextString = groupList[attCount-1];
                        }
                    }
                }

                if (gleaderBtr.IsDynamicBlock)
                {
                    DynamicBlockReferencePropertyCollection dynBRefColl = gleader.DynamicBlockReferencePropertyCollection;
                    foreach (DynamicBlockReferenceProperty prop in dynBRefColl)
                    {
                        if (prop.PropertyName == "Lookup1")
                        {
                            prop.Value = prop.GetAllowedValues()[groupList.Count-1];
                        }
                    }
                }
                tr.Commit();
            }
        }
Пример #16
0
        /// <summary>
        /// Вставка вхождения блока
        /// </summary>
        /// <param name="blName">Имя блока</param>
        /// <param name="pt">Точка вставки</param>
        /// <param name="owner">Контейнер</param>        
        /// <param name="t"></param>
        /// <param name="scale"></param>
        /// <returns></returns>
        public static BlockReference InsertBlockRef(string blName, Point3d pt, BlockTableRecord owner, Transaction t, double scale = 1)
        {
            Database db = owner.Database;
            var bt = db.BlockTableId.GetObject( OpenMode.ForRead)as BlockTable;
            var btr = bt[blName].GetObject(OpenMode.ForRead) as BlockTableRecord;
            var blRef = new BlockReference(pt, btr.Id);
            blRef.Position = pt;
            if (blRef.Annotative == AnnotativeStates.True)
            {
                // Установка аннотативного масштаба
                blRef.AddContext(db.Cannoscale);
            }
            else if (scale != 1)
            {
                blRef.TransformBy(Matrix3d.Scaling(scale, pt));
            }
            blRef.SetDatabaseDefaults();

            owner.AppendEntity(blRef);
            t.AddNewlyCreatedDBObject(blRef, true);

            AddAttributes(blRef, btr, t);
            return blRef;
        }
Пример #17
0
        // создаение блока монтажки
        private void createBlock(List<ObjectId> idsFloor, string floorBlockName)
        {
            Point3d location = getPoint($"Точка вставки блока {_planTypeName} плана {floorBlockName}").TransformBy(_ed.CurrentUserCoordinateSystem);
            using (var t = _db.TransactionManager.StartTransaction())
            {
                var bt = t.GetObject(_db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                ObjectId idBtr;
                BlockTableRecord btr;
                // создание определения блока
                using (btr = new BlockTableRecord())
                {
                    btr.Name = floorBlockName;
                    idBtr = bt.Add(btr);
                    t.AddNewlyCreatedDBObject(btr, true);
                }
                // копирование выбранных объектов в блок
                ObjectIdCollection ids = new ObjectIdCollection(idsFloor.ToArray());
                using (IdMapping mapping = new IdMapping())
                {
                    _db.DeepCloneObjects(ids, idBtr, mapping, false);
                }
                // перемещение объектов в блоке
                btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
                var moveMatrix = Matrix3d.Displacement(Point3d.Origin - location);
                foreach (ObjectId idEnt in btr)
                {
                    var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
                    ent.TransformBy(moveMatrix);
                }

                // удаление выбранных объектов
                foreach (ObjectId idEnt in ids)
                {
                    var ent = t.GetObject(idEnt, OpenMode.ForWrite, false, true) as Entity;
                    ent.Erase();
                }

                // вставка блока
                using (var blRef = new BlockReference(location, idBtr))
                {
                    blRef.SetDatabaseDefaults(_db);
                    var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                    ms.AppendEntity(blRef);
                    t.AddNewlyCreatedDBObject(blRef, true);
                }
                t.Commit();
            }
        }
Пример #18
0
        // Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ
        public static void ResetBlocks()
        {
            // Для покраски панелей, нужно, чтобы в чертеже были расставлены блоки панелей Марки СБ.
            // Поэтому, при изменении зон покраски, перед повторным запуском команды покраски панелей и создания альбома,
            // нужно восстановить блоки Марки СБ (вместо Марок АР).
            // Блоки панелей Марки АР - удалить.

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db  = doc.Database;
            Editor   ed  = doc.Editor;

            using (var t = db.TransactionManager.StartTransaction())
            {
                var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;

                var checkedBlocks = new HashSet <string>();

                foreach (ObjectId idEnt in ms)
                {
                    if (idEnt.IsValidEx() && idEnt.ObjectClass.Name == "AcDbBlockReference")
                    {
                        var blRef = t.GetObject(idEnt, OpenMode.ForRead, false, true) as BlockReference;
                        if (MarkSb.IsBlockNamePanel(blRef.Name))
                        {
                            // Если это панель марки АР, то заменяем на панель марки СБ.
                            if (MarkSb.IsBlockNamePanelMarkAr(blRef.Name))
                            {
                                string markSb       = MarkSb.GetMarkSbName(blRef.Name);  // может быть с суффиксом торца _тп или _тл
                                string markSbBlName = MarkSb.GetMarkSbBlockName(markSb); // может быть с суффиксом торца _тп или _тл
                                if (!bt.Has(markSbBlName))
                                {
                                    // Нет определения блока марки СБ.
                                    // Такое возможно, если после покраски панелей, сделать очистку чертежа (блоки марки СБ удалятся).
                                    MarkSb.CreateBlockMarkSbFromAr(blRef.BlockTableRecord, markSbBlName);
                                    string errMsg = "\nНет определения блока для панели Марки СБ " + markSbBlName +
                                                    ". Оно создано из панели Марки АР " + blRef.Name +
                                                    ". Если внутри блока Марки СБ были зоны покраски, то в блоке Марки АР они были удалены." +
                                                    "Необходимо проверить блоки и заново запустить программу.";
                                    ed.WriteMessage("\n" + errMsg);
                                    // Надо чтобы проектировщик проверил эти блоки, может в них нужно добавить зоны покраски (т.к. в блоках марки АР их нет).
                                }
                                var idBtrMarkSb = bt[markSbBlName];
                                var blRefMarkSb = new BlockReference(blRef.Position, idBtrMarkSb);
                                blRefMarkSb.SetDatabaseDefaults();
                                blRefMarkSb.Layer = blRef.Layer;
                                ms.UpgradeOpen();
                                ms.AppendEntity(blRefMarkSb);
                                t.AddNewlyCreatedDBObject(blRefMarkSb, true);
                                // Перенос плитки на слой "АР_Плитка"
                                if (checkedBlocks.Add(markSbBlName))
                                {
                                    Tile.TilesNormalize(idBtrMarkSb);
                                }
                            }
                            // Перенос плитки на слой "АР_Плитка"
                            if (checkedBlocks.Add(blRef.Name))
                            {
                                Tile.TilesNormalize(blRef.BlockTableRecord);
                            }
                        }
                    }
                }
                Caption captionPanels = new Caption(db);
                // Удаление определений блоков Марок АР.
                foreach (ObjectId idBtr in bt)
                {
                    if (!idBtr.IsValidEx())
                    {
                        continue;
                    }
                    var btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
                    if (MarkSb.IsBlockNamePanel(btr.Name))
                    {
                        // Если это блок панели Марки АР
                        if (MarkSb.IsBlockNamePanelMarkAr(btr.Name))
                        {
                            // Удаление всех вхожденний бллока
                            var idsBlRef = btr.GetBlockReferenceIds(true, true);
                            foreach (ObjectId idBlRef in idsBlRef)
                            {
                                var blRef = t.GetObject(idBlRef, OpenMode.ForWrite, false, true) as BlockReference;
                                blRef.Erase(true);
                            }
                            // Удаление определение блока Марки АР
                            btr.UpgradeOpen();
                            btr.Erase(true);
                        }
                        else
                        {
                            // Подпись марки блока
                            string panelMark = btr.Name.Substring(Settings.Default.BlockPanelAkrPrefixName.Length);
                            captionPanels.AddMarkToPanelBtr(panelMark, idBtr);
                        }
                    }
                }
                t.Commit();
            }
        }
Пример #19
0
        public void Replace()
        {
            ObjectId idBtrWin;
            if (dictIdBtrAkrWindow == null)
            {
                dictIdBtrAkrWindow = getBtrAkrWin(UtilsReplaceWindows.Db);
            }
            dictIdBtrAkrWindow.TryGetValue(TranslatorW.BlNameNew, out idBtrWin);

            if (idBtrWin.IsNull)
            {
                throw new Exception($"Ошибка, не найден блок окна {TranslatorW.BlNameNew}.");
            }

            // Создание вхождения нового блока окнак
            var blRefNew = new BlockReference(Position, idBtrWin);
            blRefNew.SetDatabaseDefaults();
            blRefNew.Layer = Settings.Default.LayerWindows;
            // добавление его в определение блок
            var btrOwner = IdBtrOwner.GetObject(OpenMode.ForWrite) as BlockTableRecord;
            btrOwner.AppendEntity(blRefNew);
            UtilsReplaceWindows.Transaction.AddNewlyCreatedDBObject(blRefNew, true);
            // Удаление старого блока.
            var blRefOldWin = IdBlRef.GetObject(OpenMode.ForWrite, false, true) as BlockReference;
            blRefOldWin.Erase();
        }
        private static void placementAparts(Database db)
        {
            using (var t = db.TransactionManager.StartTransaction())
            {
                ObjectId idTextStylePik = db.GetTextStylePIK();

                var bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
                var ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
                int countAparts;
                var btrApartGroups = getGroupedAparts(bt, out countAparts);
                Point3d pt = Point3d.Origin;
                Point3d ptCenterPlace;

                using (var progress = new ProgressMeter())
                {
                    progress.SetLimit(countAparts);
                    progress.Start("Расстановка квартир...");

                    foreach (var btrApartGroup in btrApartGroups)
                    {
                        progress.MeterProgress();

                        foreach (var idBtrApart in btrApartGroup)
                        {
                            var curPlaceWidth = placeWidth;

                            var blRefApart = new BlockReference(pt, idBtrApart);
                            blRefApart.SetDatabaseDefaults(db);
                            var extApart = blRefApart.GeometricExtents;
                            var lenApart = extApart.MaxPoint.X - extApart.MinPoint.X;
                            if (lenApart > placeWidth)
                            {
                                curPlaceWidth = lenApart + 1000;
                            }

                            ptCenterPlace = new Point3d(pt.X + curPlaceWidth*0.5, pt.Y - placeHeight*0.5, 0);

                            var ptBlCenter = extApart.Center();
                            // Перемещение блока в центр прямоугольной области
                            Matrix3d displace = Matrix3d.Displacement(ptCenterPlace - ptBlCenter);
                            blRefApart.TransformBy(displace);
                            ms.AppendEntity(blRefApart);
                            t.AddNewlyCreatedDBObject(blRefApart, true);

                            // Подпись квартиры
                            DBText text = new DBText();
                            text.SetDatabaseDefaults();
                            text.TextStyleId = idTextStylePik;
                            text.Height = 900;
                            text.TextString = getApartName(blRefApart.Name);
                            text.Position = new Point3d (pt.X+300, pt.Y+300,0);
                            ms.AppendEntity(text);
                            t.AddNewlyCreatedDBObject(text, true);

                            // Прямоугольник расположения квартиры
                            Polyline pl = new Polyline(4);
                            pl.AddVertexAt(0, pt.Convert2d(), 0, 0, 0);
                            pl.AddVertexAt(1, new Point2d (pt.X+ curPlaceWidth, pt.Y), 0, 0, 0);
                            pl.AddVertexAt(2, new Point2d(pt.X + curPlaceWidth, pt.Y-placeHeight), 0, 0, 0);
                            pl.AddVertexAt(3, new Point2d(pt.X, pt.Y - placeHeight), 0, 0, 0);
                            pl.Closed = true;
                            pl.SetDatabaseDefaults();
                            ms.AppendEntity(pl);
                            t.AddNewlyCreatedDBObject(pl, true);

                            pt = new Point3d(pt.X + curPlaceWidth, pt.Y, 0);
                        }
                        pt = new Point3d(0, pt.Y - placeHeight - 8000, 0);
                    }
                    progress.Stop();
                }
                t.Commit();
            }
        }
        private static void placementAparts(Database db)
        {
            using (var t = db.TransactionManager.StartTransaction())
            {
                ObjectId idTextStylePik = db.GetTextStylePIK();

                var     bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
                var     ms = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
                int     countAparts;
                var     btrApartGroups = getGroupedAparts(bt, out countAparts);
                Point3d pt             = Point3d.Origin;
                Point3d ptCenterPlace;

                using (var progress = new ProgressMeter())
                {
                    progress.SetLimit(countAparts);
                    progress.Start("Расстановка квартир...");

                    foreach (var btrApartGroup in btrApartGroups)
                    {
                        progress.MeterProgress();

                        foreach (var idBtrApart in btrApartGroup)
                        {
                            var curPlaceWidth = placeWidth;

                            var blRefApart = new BlockReference(pt, idBtrApart);
                            blRefApart.SetDatabaseDefaults(db);
                            var extApart = blRefApart.GeometricExtents;
                            var lenApart = extApart.MaxPoint.X - extApart.MinPoint.X;
                            if (lenApart > placeWidth)
                            {
                                curPlaceWidth = lenApart + 1000;
                            }

                            ptCenterPlace = new Point3d(pt.X + curPlaceWidth * 0.5, pt.Y - placeHeight * 0.5, 0);


                            var ptBlCenter = extApart.Center();
                            // Перемещение блока в центр прямоугольной области
                            Matrix3d displace = Matrix3d.Displacement(ptCenterPlace - ptBlCenter);
                            blRefApart.TransformBy(displace);
                            ms.AppendEntity(blRefApart);
                            t.AddNewlyCreatedDBObject(blRefApart, true);

                            // Подпись квартиры
                            DBText text = new DBText();
                            text.SetDatabaseDefaults();
                            text.TextStyleId = idTextStylePik;
                            text.Height      = 900;
                            text.TextString  = getApartName(blRefApart.Name);
                            text.Position    = new Point3d(pt.X + 300, pt.Y + 300, 0);
                            ms.AppendEntity(text);
                            t.AddNewlyCreatedDBObject(text, true);

                            // Прямоугольник расположения квартиры
                            Polyline pl = new Polyline(4);
                            pl.AddVertexAt(0, pt.Convert2d(), 0, 0, 0);
                            pl.AddVertexAt(1, new Point2d(pt.X + curPlaceWidth, pt.Y), 0, 0, 0);
                            pl.AddVertexAt(2, new Point2d(pt.X + curPlaceWidth, pt.Y - placeHeight), 0, 0, 0);
                            pl.AddVertexAt(3, new Point2d(pt.X, pt.Y - placeHeight), 0, 0, 0);
                            pl.Closed = true;
                            pl.SetDatabaseDefaults();
                            ms.AppendEntity(pl);
                            t.AddNewlyCreatedDBObject(pl, true);

                            pt = new Point3d(pt.X + curPlaceWidth, pt.Y, 0);
                        }
                        pt = new Point3d(0, pt.Y - placeHeight - 8000, 0);
                    }
                    progress.Stop();
                }
                t.Commit();
            }
        }
Пример #22
0
        /// <summary>
        /// Вставка блока в чертеж - интерактивная (BlockInsertJig)
        /// </summary>        
        public static ObjectId Insert(string blName, Layers.LayerInfo layer, List<Property> props)
        {
            ObjectId idBlRefInsert = ObjectId.Null;
            Document doc = AcAp.DocumentManager.MdiActiveDocument;
            if (doc == null) return ObjectId.Null;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (doc.LockDocument())
            using (var t = db.TransactionManager.StartTransaction())
            {
                var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                if (!bt.Has(blName))
                {
                    throw new Exception("Блок не определен в чертеже " + blName);
                }

                ObjectId idBlBtr = bt[blName];
                Point3d pt = Point3d.Origin;
                BlockReference br = new BlockReference(pt, idBlBtr);
                br.SetDatabaseDefaults();
                if (layer != null)
                {
                    Layers.LayerExt.CheckLayerState(layer);
                    br.Layer = layer.Name;
                }

                var spaceBtr = (BlockTableRecord)t.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                idBlRefInsert = spaceBtr.AppendEntity(br);
                t.AddNewlyCreatedDBObject(br, true);

                if (props != null && br.IsDynamicBlock)
                {
                    foreach (DynamicBlockReferenceProperty item in br.DynamicBlockReferencePropertyCollection)
                    {
                        var prop = props.FirstOrDefault(p => p.Name.Equals(item.PropertyName, StringComparison.OrdinalIgnoreCase));
                        if (prop != null)
                        {
                            try
                            {
                                item.Value = prop.Value;
                            }
                            catch (Exception ex)
                            {
                                Logger.Log.Error(ex, $"Ошибка типа значения для дин параметра '{item.PropertyName}' " +
                                $"при вставке блока '{blName}': тип устанавливаемого значение '{prop.Value.GetType()}', " +
                                $"а должен быть тип '{item.UnitsType}'");
                            }
                        }
                    }
                }

                // jig
                Jigs.BlockInsertJig entJig = new Jigs.BlockInsertJig(br);
                var pr = ed.Drag(entJig);
                if (pr.Status == PromptStatus.OK)
                {
                    var btrBl = t.GetObject(idBlBtr, OpenMode.ForRead) as BlockTableRecord;
                    if (btrBl.HasAttributeDefinitions)
                        AddAttributes(br, btrBl, t);
                }
                else
                {
                    br.Erase();
                    idBlRefInsert = ObjectId.Null;
                }
                t.Commit();
            }
            return idBlRefInsert;
        }
 private static void insertDesc(BlockReference blRefObr, Point3d ptDesc)
 {
     var blRefDesc = new BlockReference(ptDesc, idBtrDesc);
     blRefDesc.SetDatabaseDefaults();
     var btrObr = blRefObr.BlockTableRecord.GetObject(OpenMode.ForWrite) as BlockTableRecord;
     btrObr.AppendEntity(blRefDesc);
     t.AddNewlyCreatedDBObject(blRefDesc, true);
 }
Пример #24
0
        public void InserirBlocoNoDesenho(string nomeArquivo)
        {
            Document acDoc     = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database currDwgDb = acDoc.Database;
            Editor   acDocEd   = acDoc.Editor;

            try
            {
                using (DocumentLock docLock = acDoc.LockDocument())
                {
                    using (Database xDb = new Database(false, true))
                    {
                        xDb.ReadDwgFile(nomeArquivo, System.IO.FileShare.Read, true, "");
                        using (Transaction tr = acDoc.TransactionManager.StartTransaction())
                        {
                            string   name = SymbolUtilityServices.GetBlockNameFromInsertPathName(nomeArquivo);
                            ObjectId id   = currDwgDb.Insert(name, xDb, true);

                            if (id.IsNull)
                            {
                                acDocEd.WriteMessage("Failed to insert block");
                                return;
                            }
                            BlockTableRecord   currSpace = (BlockTableRecord)(tr.GetObject(currDwgDb.CurrentSpaceId, OpenMode.ForWrite));
                            PromptPointResult  pPtRes;
                            PromptPointOptions pPtOpts = new PromptPointOptions("");
                            //Escolher o ponto de inserção
                            pPtOpts.Message = "\nEscolha o ponto de inserção do insumo: ";
                            pPtRes          = acDoc.Editor.GetPoint(pPtOpts);
                            Point3d            p3d    = pPtRes.Value;
                            CoordinateSystem3d coordS = new CoordinateSystem3d(p3d, currDwgDb.Ucsxdir, currDwgDb.Ucsydir);
                            BlockReference     insert = new BlockReference(p3d, id);
                            insert.Normal = coordS.Zaxis;

                            //Dictionary<string, string> attValues = new Dictionary<string, string>();
                            //attValues.Add("ATT1", "foo");
                            //
                            //RXClass attDefClass = RXClass.GetClass(typeof(AttributeDefinition));
                            //foreach (ObjectId oid in currSpace)
                            //{
                            //    if (id.ObjectClass != attDefClass)
                            //        continue;
                            //    AttributeDefinition attDef = (AttributeDefinition)tr.GetObject(oid, OpenMode.ForRead);
                            //    AttributeReference attRef = new AttributeReference();
                            //    attRef.SetAttributeFromBlock(attDef, insert.BlockTransform);
                            //    if (attValues != null && attValues.ContainsKey(attDef.Tag.ToUpper()))
                            //    {
                            //        attRef.TextString = attValues[attDef.Tag.ToUpper()];
                            //    }
                            //    insert.AttributeCollection.AppendAttribute(attRef);
                            //    tr.AddNewlyCreatedDBObject(attRef, true);
                            //}

                            currSpace.AppendEntity(insert);
                            insert.SetDatabaseDefaults();
                            tr.AddNewlyCreatedDBObject(insert, true);
                            tr.Commit();
                        }
                    }
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                acDocEd.WriteMessage("\nError during copy: " + ex.Message);
            }
        }