Тема: Вставка блока из файла.

Задача: вставить блок, определенный в файле, в определенное место и с определенным масштабом.
После вставки поменять атрибут блока.

Непонимание при вставке блока. Почему-то sourceBlockName и destBlockName должны различаться, иначе вылетает ошибка "Блок ссылается сам на себя".

var fileName = @"D:\Work\Support\Блоки\BlockChertezFile.dwg";
var tmpDb = new Database(false, true);
tmpDb.ReadDwgFile(fileName,FileShare.Read,true,"");
doc.Database.Insert("BlockChertez", "BlockChertez_copy", tmpDb, true);

Вышеприведенный код работает, при этом в базе создаются 2 определения блока BlockChertez и BlockChertez_copy. Первый - нормальный, второй как будто пустой, или невидимый - при вставки и предпросмотре ничего не видно.


Расскажите, пожалуйста, может я что-то делаю не так, в чем причина такого странного поведения?

Re: Вставка блока из файла.

Разбил блок и создал заново.
Просмотрел Entities in block - он состоит только из полилиний, текста, штриховов и определения атрибута.

Вот файл с блоком, может я там накосячил

https://dl.dropboxusercontent.com/u/155 … hertez.dwg

Re: Вставка блока из файла.

У меня такой код работает

        //using System.IO;
        [CommandMethod("insa")]
        public static void ExtBlockCopyTest()
        {
            ObjectId blkTblRecId = ObjectId.Null;

            InsertBlockFromContainer(@"C:\Test\TitleExample.dwg", "TITLEBLOCK", blkTblRecId);
        }



        public static void InsertBlockFromContainer(string Container, string blkName, ObjectId blkTblRecId)
        {
            // Find the file containing all the blocks

            if (!File.Exists(Container))
            {
                MessageBox.Show("Could not find file !");

                return;

            }

            // Read the database in memory

            Database sourceDb = new Database(false, true);

            sourceDb.ReadDwgFile(Container, FileOpenMode.OpenForReadAndAllShare, false, "");

            using (Transaction sourceTr = sourceDb.TransactionManager.StartTransaction())
            {
                // Find the ObjectId of the block we are interested in.

                BlockTable sourceBt = null;

                sourceBt = sourceTr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                ObjectId sourceBtId;

                BlockTableRecord sourceBtr = null;

                if (!sourceBt.Has(blkName))
                {

                    MessageBox.Show("Block not found !");

                    return;

                }

                sourceBtr = sourceTr.GetObject(sourceBt[blkName], OpenMode.ForRead) as BlockTableRecord;

                sourceBtId = sourceBtr.ObjectId;

                Database curDoc = HostApplicationServices.WorkingDatabase;

                Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;

                // Create a new block table record in the current database.
                using (Transaction tr = curDoc.TransactionManager.StartTransaction())
                {

                    BlockTable destBt = null;

                    destBt = tr.GetObject(curDoc.BlockTableId, OpenMode.ForRead) as BlockTable;

                    ObjectId destBtId = destBt.ObjectId;

                    // WBlockClone the BlockTable record to the current database

                    ObjectIdCollection idColl = new ObjectIdCollection();

                    idColl.Add(sourceBtId);

                    // ObjectId of the btr that we want to clone

                    IdMapping idMap = new IdMapping();

                    curDoc.WblockCloneObjects(idColl, destBtId, idMap, DuplicateRecordCloning.Ignore, false);

                    // Create an instance of the block

                    BlockTableRecord destBtr = null;

                    destBtr = tr.GetObject(destBt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                    ObjectId destBtrId;

                    destBtrId = destBt[blkName];

                    // Insert an instance of the block in point(0,0,0)
                    BlockReference bref = new BlockReference(Point3d.Origin, destBtrId);

                    destBtr.AppendEntity(bref);

                    tr.AddNewlyCreatedDBObject(bref, true);
                    // Check, then insert the attributes
                    BlockTableRecord btrec = null;

                    btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;

                    if (btrec.HasAttributeDefinitions)
                    {
                        foreach (ObjectId id in btrec)
                        {
                            AttributeDefinition atdef = tr.GetObject(id, OpenMode.ForRead) as AttributeDefinition;

                            if (atdef != null)
                            {
                                using (AttributeReference atref = new AttributeReference())
                                {
                                    atref.SetAttributeFromBlock(atdef, bref.BlockTransform);

                                    atref.Position = atdef.Position + bref.Position.GetAsVector();

                                    atref.TextString = atdef.TextString;

                                    bref.AttributeCollection.AppendAttribute(atref);

                                    tr.AddNewlyCreatedDBObject(atref, true);
                                }
                            }
                        }
                    }

                    tr.Commit();
                }

            }
        }

Re: Вставка блока из файла.

Спасибо, так работает. А не знаете в чем проблема в моем коде?

Re: Вставка блока из файла.

Валерий Осипов пишет:

А не знаете в чем проблема в моем коде?

В методе insert.

Re: Вставка блока из файла.

В методе insert.

Вспомнился старый анекдот

Летят двое на воздушном шаре... Унесло их, и не знают, где они сейчас... Пролетают мимо холма, на котором сидит человек. Храбрые воздухоплаватели спрашивают его:
- Скажите, пожалуйста, где мы сейчас находимся?
Человек на холме долго думает, после чего отвечает:
- На воздушном шаре.
Более пожилой и, следовательно более умудренный опытом воздухоплаватель говорит другому:
- Этот человек на холме - математик.
- Почему же?
- Он долго раздумывал над простым вопросом, после чего дал абсолютно точный и совершенно бесполезный ответ...

(изменено: Savage, 8 мая 2013г. 09:51:58)

Re: Вставка блока из файла.

del