(изменено: Александр Пекшев aka Modis, 3 апреля 2014г. 13:45:36)

Тема: Не работает вставка

Всем доброго времени суток. Не работает вставка в текущий чертеж из другого чертежа. Код был найден на просторах инета (с отрисовкой на курсоре):

public static void InsertFromDwgFile(string fileName)
        {
            try
            {

                SetFocus(Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Window.Handle);

                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

                Editor ed = doc.Editor;

                Point3d ptNew = Point3d.Origin;


                using (doc.LockDocument())
                {

                    Database currentDb = doc.Database;

                    ObjectIdCollection ids = new ObjectIdCollection();

                    IdMapping idMap = new IdMapping();

                    using (Transaction tr = doc.TransactionManager.StartTransaction())
                    {

                        BlockTable currBt = (BlockTable)tr.GetObject(currentDb.BlockTableId, OpenMode.ForRead);

                        BlockTableRecord currBtr =
                            (BlockTableRecord)tr.GetObject(currBt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

                        using (Database sourceDb = new Database(false, false))
                        {

                            sourceDb.ReadDwgFile(fileName, System.IO.FileShare.ReadWrite, false, "");

                            using (Transaction sourcetr = sourceDb.TransactionManager.StartTransaction())
                            {

                                ObjectIdCollection sourceIds = new ObjectIdCollection();

                                using (
                                    BlockTableRecord sourceBtr =
                                        (BlockTableRecord)sourcetr.GetObject(sourceDb.CurrentSpaceId, OpenMode.ForRead)
                                    )
                                {

                                    if (sourceBtr != null)
                                    {

                                        sourceIds = new ObjectIdCollection();

                                        foreach (ObjectId id in sourceBtr)
                                        {
                                            if (!id.IsNull && id.IsValid) //optional
                                                sourceIds.Add(id);
                                        }

                                        sourcetr.Commit();
                                    }

                                    if (sourceIds.Count != 0)
                                        idMap = new IdMapping();

                                    sourceDb.WblockCloneObjects(sourceIds, currBtr.ObjectId, idMap,
                                                                DuplicateRecordCloning.Ignore, false);

                                }

                            }
                        }


                        foreach (IdPair ip in idMap)
                        {
                            if (ip.IsPrimary) ids.Add(ip.Value);

                        }


                        var copied = new ObjectId[ids.Count];

                        ids.CopyTo(copied, 0);

                        ed.SetImpliedSelection(copied);

                        PromptSelectionResult psr = ed.SelectImplied();

                        if (psr.Status == PromptStatus.OK)
                        {
                            var ppr =
                                ed.Drag(
                                    psr.Value,
                                    "\nУкажите точку вставки: ",
                                    delegate(Point3d pt, ref Matrix3d mtx)
                                    {

                                        if (ptNew == pt)
                                        {
                                            return SamplerStatus.NoChange;
                                        }
                                        mtx =
                                            Matrix3d.Displacement(
                                                ptNew.GetVectorTo(pt)
                                                );
                                        return SamplerStatus.OK;
                                    }
                                    );


                            if (ppr.Status == PromptStatus.OK)
                            {

                                var mtx =
                                    Matrix3d.Displacement(
                                        ptNew.GetVectorTo(ppr.Value)
                                        );
                                foreach (SelectedObject sobj in psr.Value)
                                {
                                    var en = tr.GetObject(sobj.ObjectId, OpenMode.ForRead, false) as Entity;
                                    if (en != null)
                                    {
                                        en.UpgradeOpen();
                                        en.TransformBy(mtx);
                                        en.DowngradeOpen();
                                    }
                                }
                            }
                            else
                            {
                                foreach (SelectedObject sobj in psr.Value)
                                {
                                    var en = tr.GetObject(sobj.ObjectId, OpenMode.ForWrite, false) as Entity;
                                    if (en != null)
                                    {
                                        en.Erase(true);
                                    }
                                }
                            }
                            ed.SetImpliedSelection(new ObjectId[] { });

                            tr.Commit();

                        }
                    }
                }
            }

            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace + "\n" + ex.TargetSite);
            }
        }

Вся фишка в том, что у меня работает, а у человека в другом городе - нет. И я не могу понять почему.
Скрин ошибки прилагаю. Надеюсь на свежие идеи)
Не работает вставка

Re: Не работает вставка

Забыл добавить - не работает после указания точки вставки. Т.е. на курсоре все отрисовывается

(изменено: Андрей, 3 апреля 2014г. 14:24:48)

Re: Не работает вставка

То, что сразу бросилось в глаза:

using (Transaction sourcetr = sourceDb.TransactionManager.StartTransaction())

Тынц.

if (!id.IsNull && id.IsValid) //optional 

на всякий случай лучше добавить и проверку на уничтожено\"эффективно уничтожено" (имхо).

if (sourceIds.Count != 0) 
idMap = new IdMapping();

Смысл? Ты его и так недавно создал и ещё не использовал.

ed.SetImpliedSelection(copied);
PromptSelectionResult psr = ed.SelectImplied();

Масло маслянное?

Далее не читал, потому, т.к. в сказке: чем дальше, тем страшнее :).

Re: Не работает вставка

рекомендую задавать вопросы не на мёртвом форуме, а здесь: http://adn-cis.org/forum/index.php?board=4.0