Проникающая гидроизоляция бетона
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET. Jig при вставке из другого файла

.NET. Jig при вставке из другого файла

Ответ
Поиск в этой теме
Непрочитано 22.07.2013, 11:01 #1
.NET. Jig при вставке из другого файла
Modis
 
Липецк, Москва
Регистрация: 12.06.2010
Сообщений: 534

Всем привет. Наверно я уже старею и тупею, но не могу решить простую проблемку
Итак - нужно в данный чертеж импортировать элементы из другого чертежа (не открывая его)
Вот есть такой код:
Код:
[Выделить все]
public static void InsertFromDwgFile(string fileName)
        {
            try
            {
                SetFocus(Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Window.Handle);
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                using (doc.LockDocument())
                {
                    Database currentDb =
                        Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
                    Database sourceDb = new Database(false, true);
                    sourceDb.ReadDwgFile(fileName,
                                         System.IO.FileShare.Read,
                                         true, "");

                    ObjectId currentMsId = SymbolUtilityServices.GetBlockModelSpaceId(currentDb);
                    ObjectId sourceMsId = SymbolUtilityServices.GetBlockModelSpaceId(sourceDb);

                    ObjectIdCollection sourceIds = new ObjectIdCollection();
                    using (BlockTableRecord ms = sourceMsId.GetObject(OpenMode.ForRead)//.Open(OpenMode.ForRead)
                                                 as BlockTableRecord)
                        // loop all the entities and record their ids
                        if (ms != null)
                            foreach (ObjectId id in ms)
                                sourceIds.Add(id);

                    IdMapping mapping = new IdMapping();
                    sourceDb.WblockCloneObjects(sourceIds, currentMsId, mapping, DuplicateRecordCloning.Ignore, false);
                    
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Все вставляется с теми-же координатами, что и в файле-источнике. А мне нужно указать точку вставки. И вот как теперь сюда подключить Jig'у - не могу сообразить ((
Просмотров: 1662
 
Непрочитано 22.07.2013, 23:09
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Типа того, тестировал только в 2009-м:

Код:
[Выделить все]
        [CommandMethod("heh", CommandFlags.Session | CommandFlags.Redraw)]
        public static void testWblockExternal()
        {
            InsertFromDwgFile(@"C:\Test\myfile.dwg");
        }

        public static void InsertFromDwgFile(string fileName)
        {
            try
            {                
                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, FileOpenMode.OpenForReadAndAllShare, 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);

                        }

                        ObjectId[] copied = new ObjectId[ids.Count];

                        ids.CopyTo(copied, 0);

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

                        PromptPointResult ppr =
                          ed.Drag(
                            psr.Value,
                            "\nSelect new point position: ",
                            delegate(Point3d pt, ref Matrix3d mtx)
                            {

                                if (ptNew == pt)
                                    return SamplerStatus.NoChange;
                                else
                                {

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



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

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

                }
            }

            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
            }
        }
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 23.07.2013, 11:43
#3
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Упорно не работает при вызове из формы ((
Modis вне форума  
 
Непрочитано 23.07.2013, 12:12
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Modis Посмотреть сообщение
Упорно не работает при вызове из формы ((
Играй с формой самостоятельно, я тебе показал алгоритм,
работает вплоть до 2014 версии
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 23.07.2013, 12:17
#5
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Спасибо. Я проверил - да работает.
А проблема с формой касается вот этой части
Код:
[Выделить все]
PromptPointResult ppr =
                          ed.Drag(
                            psr.Value,
                            "\nSelect new point position: ",
                            delegate(Point3d pt, ref Matrix3d mtx)
                            {

                                if (ptNew == pt)
                                    return SamplerStatus.NoChange;
                                else
                                {

                                    mtx =
                                      Matrix3d.Displacement(
                                        ptNew.GetVectorTo(pt)
                                      );
                                }
                                return SamplerStatus.OK;
                            }
                          );
Причем не зависимо от того как вызвана форма (модально или нет) и закрывается она или сворачивается
Modis вне форума  
 
Непрочитано 23.07.2013, 12:30
#6
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Как предположение кури Editor.StartuserInteraction(this);
если немодальная
потом закрой EndUserInteraction - синтаксис не помню
Смотри здесь
http://adndevblog.typepad.com/autoca...ser-input.html
и здесь
http://forums.autodesk.com/t5/NET/Pr...ht/true#M35343

Последний раз редактировалось Олег (jr.), 23.07.2013 в 12:38. Причина: добавлена ссылка
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 29.07.2013, 22:15
#7
Modis


 
Регистрация: 12.06.2010
Липецк, Москва
Сообщений: 534


Еще раз спасибо! С окнами разобрался.
Но есть другая проблема (( У меня все работает на ура на двух компах (win8, cad2007), а вот у пользователя не работает (winXP, cad2007-2008). Проблема в том, что пользователь находится за 500 км от меня и у меня ни как не получается вызвать такую ошибку
Вот ошибка:
Цитата:
************** Exception Text **************
System.ArgumentNullException: Value cannot be null.
Parameter name: selection
at Autodesk.AutoCAD.EditorInput.PromptDragOptions.CommonInit(SelectionSet selection, DragCallback callback)
at Autodesk.AutoCAD.EditorInput.Editor.Drag(SelectionSet selection, String message, DragCallback callback)
at SEToolbar.AcadWorks.InsertFromDwgFile(String fileName)
.................................
Т.е. получается, что у пользователя ничего не попадает в выбор? Почему?
Modis вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET. Jig при вставке из другого файла

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать drawing custom properties из другого файла Red Nova AutoCAD 20 20.04.2015 19:18
ССылка на текст из другого файла Kosenko Sasha AutoCAD 8 18.07.2013 20:39
MS Word Нужен скрипт для копирования с одновременной заменой части текста Солидворкер Прочее. Программное обеспечение 27 27.11.2012 15:52
Проблема с запуском на Windows 7 из другого .NET приложения (COMException 80080005) IvanShkuropadsky .NET 4 26.07.2011 10:23
Обновление/замена блока с таким же именем из другого файла. Pesec AutoCAD 2 11.11.2009 19:33