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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > С# проблема с открытием чертежа и работой на нем

С# проблема с открытием чертежа и работой на нем

Ответ
Поиск в этой теме
Непрочитано 03.04.2011, 13:18 #1
С# проблема с открытием чертежа и работой на нем
Popova_Elena
 
Регистрация: 03.04.2011
Сообщений: 2

Помогите пожалуйста! Мне нужно открыть уже существующий чертеж и добавить на него слой. Я загружаю dll, пишу команду, нужный чертеж открывается и становится активным, но слой добавляется не на него, а на тот, который автоматически создался при открытии автокада. Подскажите, что я делаю не так? Вот мой код:
Код:
[Выделить все]
public void OpenDrawing()
        {
            ObjectId drawingId = ObjectId.Null;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            PromptStringOptions pStrOpts = new PromptStringOptions("\nВведите название чертежа: ");
            pStrOpts.AllowSpaces = true;
            PromptResult pStrRes = acDoc.Editor.GetString(pStrOpts);
            string strFileName = pStrRes.StringResult;
            DocumentCollection acDocMgr = Application.DocumentManager;
            if (File.Exists(strFileName))
            {
                acDoc = acDocMgr.Open(strFileName, false);
                acDocMgr.MdiActiveDocument = acDoc;
                CreateLayer();
            }
            else
            {
                acDocMgr.MdiActiveDocument.Editor.WriteMessage("\nФайла " + strFileName + " не существует.");
            }
        }

Последний раз редактировалось Кулик Алексей aka kpblc, 03.04.2011 в 20:08.
Просмотров: 3370
 
Непрочитано 03.04.2011, 15:41
#2
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Как вариант, переписать функцию CreateLayer() так, чтобы она получала аргумент - ссылку на документ, в котором необходимо создать слой, а так же делать документ активным в самом конце функци:
Код:
[Выделить все]
if (File.Exists(strFileName))
{
acDoc = acDocMgr.Open(strFileName, false);
CreateLayer(acDoc);
acDocMgr.MdiActiveDocument = acDoc;
}
else
{
acDocMgr.MdiActiveDocument.Editor.WriteMessage("\n Файла " + strFileName + " не существует.");
}
}
Краем уха слышал, что в общем случае, когда по ходу выполнения команды требуется переключать активный документ, то необходимо определять команду с атрибутом [CommandMethod("MyCommand", CommandFlags.Session)]
и прежде чем что-то делать с тем или иным документом необходимо запрашивать его блокировку (право на единоличное пользование) с помощью экземплярного метода аcDoc.LockDocument() и использования примерно такой конструкции:
Код:
[Выделить все]
DocumentLock docloc = AcDoc.LockDocument();
using (docloc)
{
    Какие-то действия с документом
} // блокировка автоматически освобождается при выходе из блока using.
Так же блокировка требуется, если необходимо производить какие-то манипуляции с документом в качестве реакции на действия пользователя в немодальном д.окне. Вот пример.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 03.04.2011 в 16:12.
Pastor вне форума  
 
Автор темы   Непрочитано 03.04.2011, 18:27
#3
Popova_Elena


 
Регистрация: 03.04.2011
Сообщений: 2


Большое спасибо, блокировка помогла )

Последний раз редактировалось Popova_Elena, 04.04.2011 в 19:31.
Popova_Elena вне форума  
 
Непрочитано 03.04.2011, 18:48
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Код метода CreateLayer() вызвать с помощью телепатии мне не удалось...
Вникайте в этот код (нацарапал на скорую руку, проверил - работает):
Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using acad = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System.IO;

namespace AcadTest
{
    public class Class1 : IExtensionApplication
    {
        //Переменные, с помощью которого будем работать с активным документом AutoCAD.
        static Document dwg;
        static Editor ed;
        static Database db;

        /// <summary>
        /// Метод, код которого запускается при загрузке библиотеки - команда NetLoad.
        /// </summary>
        public void Initialize()
        {
            //Регистрируемся на событие активации документа
            acad.DocumentManager.DocumentActivated+=new DocumentCollectionEventHandler(DocumentManager_DocumentActivated);
            //Инициализируем переменные первый раз
            dwg = acad.DocumentManager.MdiActiveDocument;
            ed = dwg.Editor;
            db = dwg.Database;
        }
        
        void DocumentManager_DocumentActivated(object sender, DocumentCollectionEventArgs e)
        {
            dwg = e.Document;
            ed = dwg.Editor;
            db = dwg.Database;
        }

        public void Terminate()
        {
            //Если требуется освобождение неуправляемых ресурсов - можно это выполнить здесь.
        }

        /// <summary>
        /// Тестовая команда (в данном случае достаточна флага Modal). "За кулисами" открываем базу данных интересующего нас файла чертежа, изменяем его, после чего сохраняем изменения. Пользователь не видит выполняемых нами операций
        /// </summary>
        [CommandMethod("test", CommandFlags.Modal)]
        public void Test()
        {
            //Запрашиваем имя файла
            PromptStringOptions pso = new PromptStringOptions("\nИмя файла: ");
            pso.AllowSpaces = true;
            PromptResult pr = ed.GetString(pso);
            //Проверяем, что имя файла было передано и что оно корректно
            if (pr.Status != PromptStatus.OK)
                return;
            string fileName = pr.StringResult;
            if (!File.Exists(fileName))
            {
                ed.WriteMessage("\nУказанный вами файл не найден. Работа команды прервана.");
                return;
            }
            //Если файл с указанным именем существует - пытаемся открыть его базу данных для изменения
            using (Database db2 = new Database(false, true))
            {
                bool needSave = false;
                try
                {
                    db2.ReadDwgFile(fileName, System.IO.FileShare.ReadWrite, false, "");
                }
                catch (System.Exception ex)
                {
                    ed.WriteMessage(string.Format("\nПри попытке получения доступа к чертежу произошла ошибка: '{0}'", ex.Message));
                    return;
                }  
                //Если открыть удалось - проверяем, есть ли слой с интересующим нас именем...
                using (Transaction ts = db2.TransactionManager.StartTransaction())
                {                    
                    LayerTable lt = (LayerTable)ts.GetObject(db2.LayerTableId, OpenMode.ForWrite);
                    //Запрашиваем имя слоя
                    PromptStringOptions pso1 = new PromptStringOptions("\nИмя нового слоя: ");
                    pso1.AllowSpaces = true;
                    PromptResult pr1 = ed.GetString(pso1);

                    if (pr1.Status != PromptStatus.OK || pr1.StringResult.Trim() == string.Empty)
                    {
                        ed.WriteMessage("\nИмя слоя не задано. Выполнение команды прервано");
                        return;
                    }
                    string layerName = pr1.StringResult;
                    LayerTableRecord ltr = new LayerTableRecord() { Name = layerName };
                    //Если слой есть...
                    if (lt.Has(layerName))
                    {
                        ed.WriteMessage(string.Format("Файл '{0}' уже содержит в себе слой '{1}'", fileName, layerName));
                        return;
                    }
                    //Если слоя нет...
                    lt.Add(ltr);
                    ts.AddNewlyCreatedDBObject(ltr, true);
                    ts.Commit();
                    needSave = true;
                }
                //Сохраняем выполненные нами изменения (если таковые присутствуют)
                if (needSave)
                {
                    try
                    {
                        db2.SaveAs(fileName, DwgVersion.Current);
                    }
                    catch (System.Exception ex)
                    {
                        ed.WriteMessage(string.Format("\nПри попытке сохранения чертежа произошла ошибка: '{0}'", ex.Message));
                    }
                }
            }
        }
    }
}
Цитата:
Сообщение от Popova_Elena
Большое спасибо, блокировка помогла ) сделала так:
acDoc.LockDocument();
using (acDoc)
{
//Действия с документом
}
Ну раз устраивает то, что файл визуально открывается - то... хозяин - барин (с).
P.S.
Если нужно программно внести изменение в уже существующий dwg-файл, после чего закрыть его, то делать это лучше, так сказать - "за кулисами", не открывая при этом визуально самого чертежа, чтобы не "танцевать" с переключением активного документа и не напрягать юзера открывающимися и закрывающимися перед его носом файлами. Это я поясняю, т.к. судя по всему автор мой код не смотрела... Если чертёж всё же должен открываться визуально и после изменений оставаться открытым и доступным юзеру для работы - тогда показанный мною код не пойдёт, ибо ориентирован на скрытую обработку документа.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 03.04.2011 в 21:01. Причина: подробнее расписал примечания и P.S.
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > С# проблема с открытием чертежа и работой на нем

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка dwg в xls как OLE. Проблема с открытием. Кларисса AutoCAD 2 27.06.2008 13:43
Проблема с открытием нескольких файлов Gela_01 AutoCAD 28 13.06.2008 16:41
Проблема с открытием Счетовод AutoCAD 7 11.03.2008 11:57
Проблема с печатью чертежа gdr AutoCAD 7 27.05.2007 20:58
Проблема вывода чертежа на нестандартный лист (Acad2002) plaz AutoCAD 7 30.10.2003 09:56