Тема: Вставить все XREF

Нужно вставить все XREF которые есть в чертеже.
Вот нашел код в сети.

[CommandMethod("dpBindAll")]
        public void dpBindAll()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;            
            try
            {
                using (Transaction tr = doc.TransactionManager.StartTransaction())
                {
                    ObjectIdCollection btrCol = new ObjectIdCollection();
                    XrefGraph xrGraph = db.GetHostDwgXrefGraph(false);
                    for(int i = 1; i < xrGraph.NumNodes; i++)
                    {
                        XrefGraphNode xrNode = xrGraph.GetXrefNode(i);
                        BlockTableRecord btr = tr.GetObject(xrNode.BlockTableRecordId, OpenMode.ForWrite) as BlockTableRecord;
                        //Application.ShowAlertDialog(xrNode.Name + " - " + i.ToString() + " - " + xrGraph.NumNodes.ToString());
                        switch (xrNode.XrefStatus)
                        {
                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Resolved:
                                btrCol.Add(xrNode.BlockTableRecordId);
                                ed.WriteMessage("\nДобавляем Xref: " + btr.Name);
                            break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Unloaded:
                                ed.WriteMessage("\nUnloaded: " + btr.Name);
                            break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.FileNotFound:
                            ed.WriteMessage("\nFileNotFound: " + btr.Name);
                            break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.NotAnXref:
                            ed.WriteMessage("\nNotAnXref: " + btr.Name);
                            break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Unreferenced:
                            ed.WriteMessage("\nUnreferenced: " + btr.Name);
                            break;
                        }
                    }
                    //return;
                    try
                    {
                        if (btrCol.Count > 0)
                        {
                            ed.WriteMessage("\nПробуем вставить");
                            foreach (ObjectId id in btrCol)
                            {
                                db.BindXrefs(btrCol, true);
                                ed.WriteMessage("\nВставили");
                            }
                        }
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception ee)
                    {
                        ed.WriteMessage("\n Ошибка вставки Xref!" + ee);
                    }
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ee)
                {
                    ed.WriteMessage("\nОшибка!" + ee);
                }
        }

на строчке db.BindXrefs(btrCol, true); ошибка eWrongObjectType в AutoCAD

Xref!Autodesk.AutoCAD.Runtime.Exception: eWrongObjectType
   at Autodesk.AutoCAD.DatabaseServices.Database.BindXrefs(ObjectIdCollection xrefIds, Boolean insertBind)
   at dpLayoutsToSepFiles.Class1.dpBindAll() in c:\Visual Studio 2013\Projects\dpLayoutsToSepFiles\dpLayoutsToSepFiles\Class1.cs:line 152

Подскажите чего не так. Спасибо.

Re: Вставить все XREF

У Вас тип объекта передаваемый в BindXrefs, вроде правильный.
Хотя и есть ряд вопросов:
1. Зачем цикл с перебором ObjectID вокруг  db.BindXrefs(btrCol, true);
2. Куда завершение транзакции дели tr.Commit();
3. Тут Вам быстрее помогу http://adn-cis.org/forum/index.php?board=4.0

Я хоть в C# без года неделю, но после выкидывания цикла и добавления коммита у меня все отработало без ошибок.

Command: *Cancel*
Command: _XATTACH
Attach Xref "Drawing5": D:\0091\Drawing5.dwg
"Drawing5" loaded.
Command: '_.zoom _e
Command: NETLOAD
Command: DPBINDALL
 Добавляем Xref: Drawing5
 Пробуем вставить
Duplicate Block "_ArchTick" ignored.
Duplicate Block "SectionBubbleDef" ignored.
Duplicate Block "A1_goriz" ignored.
Duplicate Block "Дополнительная графа 1" ignored.
Duplicate Block "Доп.графа2" ignored.
Duplicate Block "A2_goriz" ignored.
Duplicate Block "A3_goriz" ignored.
Duplicate Block "A4_vert" ignored.
 Вставили
 ========ВСЁ!=======
       [Rtm.CommandMethod("dpBindAll")]
        public void dpBindAll()
        {
            App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Ed.Editor ed = doc.Editor;
            Db.Database db = doc.Database;
            try
            {
                using (Db.Transaction tr = doc.TransactionManager.StartTransaction())
                {
                    Db.ObjectIdCollection btrCol = new Db.ObjectIdCollection();
                    Db.XrefGraph xrGraph = db.GetHostDwgXrefGraph(false);
                    for (int i = 1; i < xrGraph.NumNodes; i++)
                    {
                        Db.XrefGraphNode xrNode = xrGraph.GetXrefNode(i);
                        Db.BlockTableRecord btr = tr.GetObject(xrNode.BlockTableRecordId, Db.OpenMode.ForWrite) as Db.BlockTableRecord;
                        switch (xrNode.XrefStatus)
                        {
                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Resolved:
                                btrCol.Add(xrNode.BlockTableRecordId);
                                ed.WriteMessage("\n Добавляем Xref: " + btr.Name);
                                break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Unloaded:
                                ed.WriteMessage("\n Unloaded: " + btr.Name);
                                break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.FileNotFound:
                                ed.WriteMessage("\n FileNotFound: " + btr.Name);
                                break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.NotAnXref:
                                ed.WriteMessage("\n NotAnXref: " + btr.Name);
                                break;

                            case Autodesk.AutoCAD.DatabaseServices.XrefStatus.Unreferenced:
                                ed.WriteMessage("\n Unreferenced: " + btr.Name);
                                break;
                        }
                    }
                    try
                    {
                        if (btrCol.Count > 0)
                        {
                            ed.WriteMessage("\n Пробуем вставить");
                            //Db.ObjectIdCollection btrCol = new Db.ObjectIdCollection();
                            db.BindXrefs(btrCol, true);
                            ed.WriteMessage("\n Вставили");
                        }
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception ee)
                    {
                        ed.WriteMessage("\n Ошибка вставки Xref!" + ee);
                    }

                 // end using
                    tr.Commit();
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ee)
            {
                ed.WriteMessage("\nОшибка!" + ee);
            }
            ed.WriteMessage("\n ========ВСЁ!=======");
        }

Re: Вставить все XREF

Вот что называется свежий взгляд. Глаз у меня как говорится замылился. Спасибо. Так действительно все работает.

Re: Вставить все XREF

По поводу цикла... Сразу же бросается в глаза, что индексация начинается с 1, а не с 0:

 for(int i = 1; i < xrGraph.NumNodes; i++) 

Обычно индексация начинается с нуля.

Re: Вставить все XREF

Андрей, не с 0 т.к. 0 - это сам файл, в котором пытаемся забиндить внешние ссылки.

Re: Вставить все XREF

Денис Перепецкий пишет:

NumNodes

Я написал слово "обычно". Как это реализовано в NumNodes - я не смотрел. :)

Re: Вставить все XREF

А если нужно не только внедрить ссылки, но и удалить "лишние". Те, у которых XrefStatus=XrefStatus.Unloaded, например. Это как делается? Тоже есть какой-то метод у Database или с XrefGraph надо работать и XrefGraphNode удалять?

Re: Вставить все XREF

DetachXref()?