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(); }
// Замена вхождения блока СБ на АР 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(); //} }
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); }
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); }); }
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)); }
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); }
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); }
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); } }
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); } }
// создаение блока монтажки 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(); } }
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); } } } }
// Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ 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(); } }
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); } } } }
/// <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); }
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(); } }
/// <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; }
// создаение блока монтажки 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(); } }
// Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ 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(); } }
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(); } }
/// <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; }
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); } }