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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Работа с подшивкой.

Lisp. Работа с подшивкой.

Ответ
Поиск в этой теме
Непрочитано 29.09.2011, 14:06 #1
Lisp. Работа с подшивкой.
молодой человек
 
Регистрация: 14.11.2007
Сообщений: 159

Как получить хоть какую-нибудь информацию?
В частности:
-список файлов,принадлежащих подшивке;
-указатели на листы;

В документации написано, что можно делать на vba. Но я с ним не знаком(
Просмотров: 6729
 
Непрочитано 29.09.2011, 16:31
1 | #2
Сергей Богатов


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


Не получится. Темы уже были см.
http://forum.dwg.ru/showthread.php?t=23132&page=8

начиная с 211 поста
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 03.10.2011, 12:46
1 | #3
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Как получить хоть какую-нибудь информацию?
В частности:
-список файлов,принадлежащих подшивке;
-указатели на листы;

В документации написано, что можно делать на vba. Но я с ним не знаком(
Если нужна именно lisp-функция, у которой нет доступа к каким-то закоулкам AutoCAD, то её можно написать на .net (если ты его знаешь) и затем использовать в своих lisp-программках. Здесь, в классе DrawingSearcher, в коде метода GetSheetSetDrawings можно глянуть, как получить все чертежи, входящие в состав подшивки. А здесь - пример написания lisp-функции на дотнете. Если помимо лиспа знаешь дотнет, то скрестить ежа с ужом и получить нужный тебе результат - не составит труда. Если дотнета не знаешь - ссылки можно даже не открывать.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 03.10.2011, 14:57
#4
Сергей Богатов


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


Offtop: Лучше тогда сразу на .NET всё и написать
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 03.10.2011, 15:21
#5
hwd

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


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
Offtop: Лучше тогда сразу на .NET всё и написать
Если у автора уже есть готовый код на лиспе, и не хватает лишь некоторых деталей, то написание lisp-функции на дотнете может оказаться более быстрым по времени, чем переписывание всего проекта в целом с лиспа на дотнет (это уж ему решать).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 11.10.2011, 16:01
#6
молодой человек


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


Все-таки настал момент когда lispa не хватает. В связи с этим вопрос- какой язык программирования учить дальше!?
Для себя выбрал 3 пути:
1) C#
2) с++ пока без objectarx
3) Delphi
Пока что читаю книги по с++.
Подскажите, пожалуйста, какой из этих языков лучше использовать для связи с автокадом через com для работы с подшивками?
Чем лучше писать диалоговые окна? Какой перспективнее?
Извините за сумбур, так как пока не владею вопросом.
молодой человек вне форума  
 
Непрочитано 11.10.2011, 16:28
#7
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Все-таки настал момент когда lispa не хватает. В связи с этим вопрос- какой язык программирования учить дальше!?
Для себя выбрал 3 пути:
1) C#
2) с++ пока без objectarx
3) Delphi
Пока что читаю книги по с++.
Подскажите, пожалуйста, какой из этих языков лучше использовать для связи с автокадом через com для работы с подшивками?
Чем лучше писать диалоговые окна? Какой перспективнее?
Извините за сумбур, так как пока не владею вопросом.
свой выбор могу не озвучивать - он и так очевиден. Советую посмотреть немного вперёд - на тот же Windows 8, а в нём, к примеру, графический интерфейс на WPF. А если вспомнить ещё и про WinRT, то... Есть над чем задуматься.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 11.10.2011, 19:28
#8
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Цитата:
Советую посмотреть немного вперёд - на тот же Windows 8, а в нём, к примеру, графический интерфейс на WPF. А если вспомнить ещё и про WinRT, то... Есть над чем задуматься.
Все это в равной мере буде доступно из C++, С# и JavaScript.
http://www.infoq.com/news/2011/09/WinRT-API
__________________
На свете счастья нет, но есть покой и воля.

Последний раз редактировалось Sad Dog, 11.10.2011 в 19:43.
Sad Dog вне форума  
 
Непрочитано 11.10.2011, 20:45
#9
hwd

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


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
Все это в равной мере буде доступно из C++, С# и JavaScript.
http://www.infoq.com/news/2011/09/WinRT-API
Я это знаю. Речь о том, что дотнет используется всё больше - даже WinAPI для него будет (точнее - уже есть). Это должно быть поудобней, чем обращение к WinAPI в данный момент времени. C# гораздо удобней в работе чем C++, а так же проще в изучении. Он более дружелюбный что ли, и является по настоящему объектно-ориентированным в отличие от C++ (это видно на примере делегатов и исключений - в дотнете это полноценные объекты, а в C++ - нет).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 11.10.2011, 21:09
#10
молодой человек


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


hwd, спасибо за советы. Всё-таки C# перевесил и остановлюсь на нём. Не могли бы Вы порекомендовать хорошую книгу для начинающих по C#?
И если есть- справочник на подобии книги Полещука по Autolisp, чтобы можно было чужой код разбирать?
молодой человек вне форума  
 
Непрочитано 11.10.2011, 21:54
1 | #11
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
hwd, спасибо за советы. Всё-таки C# перевесил и остановлюсь на нём. Не могли бы Вы порекомендовать хорошую книгу для начинающих по C#?
И если есть- справочник на подобии книги Полещука по Autolisp, чтобы можно было чужой код разбирать?
Скачайте (можете у меня скачать) спецификацию языка C# и читайте её - это достаточно хороший справочник. Из книг в качестве справочника советую Герберта Шилдта "Полное руководство C# 4.0". Хотя, честно говоря, имея на руках спецификацию - можно и без Шилдта обойтись. Среди .Net-программистов своего рода Библией является книга, написанная Троелсеном (эта). Петцольда и Рихтера пока рекомендовать не буду - Вам бы эти сначала осилить, они не маленькие
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 24.05.2012, 16:25
#12
молодой человек


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


Здравствуйте! Написал программку, которая считывает нужную мне информацию из подшивки (за что спасибо hwd).
Но обнаружил, что если в момент работы программы открыта исследуемая подшивка, то это приводит к вылету автокада.
Причём вылет происходит не сразу, а после завершения моей программы через некоторое время.
В связи с эти вопрос:
1. Как при помощи С# закрыть окно диспетчера подшивки, если оно открыто?
молодой человек вне форума  
 
Непрочитано 24.05.2012, 16:38
#13
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
обнаружил, что если в момент работы программы открыта исследуемая подшивка, то это приводит к вылету автокада.
Причём вылет происходит не сразу, а после завершения моей программы через некоторое время.
В связи с эти вопрос:
1. Как при помощи С# закрыть окно диспетчера подшивки, если оно открыто?
имхо - лучше найти в коде ошибку и исправить, чем пытаться обойти её окольными способами. Кроме того - диспетчер подшивок может быть открыт и без подшивок.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 24.05.2012, 16:59
#14
молодой человек


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


Дело в том, что при отладке программа работает исправно(даже если подшивка открыта), поэтому найти где происходит спотыкание- невозможно.
После того как программа закончила свою работу- проходит какое-то время и происходит вылет. А если перед началом программы подшивка закрыта, то всё нормально.
Попутно задам ещё вопросы:
2. Может есть какой-то метод по аналогии с Autolisp "изучить" для того, чтобы можно было получить при отладке значения всех доступных методов, свойств и так далее.
(обозреватель объектов, быстрая проверка не даёт нужного результата)
молодой человек вне форума  
 
Непрочитано 24.05.2012, 17:11
#15
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Дело в том, что при отладке программа работает исправно(даже если подшивка открыта), поэтому найти где происходит спотыкание- невозможно.
После того как программа закончила свою работу- проходит какое-то время и происходит вылет. А если перед началом программы подшивка закрыта, то всё нормально.
Попутно задам ещё вопросы:
2. Может есть какой-то метод по аналогии с Autolisp "изучить" для того, чтобы можно было получить при отладке значения всех доступных методов, свойств и так далее.
(обозреватель объектов, быстрая проверка не даёт нужного результата)
Не видя кода ошибку выявить 100% не удастся. По второму вопросу - чем отладчик MS VS не устроил? Для изучения БД чертежа можно использовать ArxDbg (ищи в ObjectARX SDK).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 24.05.2012, 21:24
#16
молодой человек


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


Класс DrawingSearcher в общем-то практически не отличается от того что вы выкладывали у себя на сайте.

Код:
[Выделить все]
 using Autodesk.AutoCAD.EditorInput;
using acad = Autodesk.AutoCAD.ApplicationServices.Application;
using ACSMCOMPONENTS18Lib;
using System;
using System.IO;

using System.Collections.Generic;

namespace AcadBatchProcessing
{
    public  sealed class DrawingSearcher
    {
        string drawingExtensionFilter = "*.dwg";
        /// <summary>
        /// Типы файлов, которые необходимо обрабатывать в поиске
        /// </summary>
        public string FileExtensionsFilter
        {
            get { return drawingExtensionFilter; }
            set { drawingExtensionFilter = value; }
        }

        //id_Sheet- глобальная переменная , 
        //в которой находится id вызываемой подшивки. Должна объявляться в теле класса, чтобы быть доступной всем методам класса
        // public- позволяет использовать переменную вне класса DrawingSearcher
        public string id_Sheet; 

        Editor ed = acad.DocumentManager.MdiActiveDocument.Editor;

       

        /// <summary>
        /// Получение файлов чертежей, входящих в состав определённой подшивки
        /// </summary>
        /// <param name="DstFileFullName">Полное имя файла подшивки</param>
        /// <returns>Возвращается перечисление объектов FileInfo</returns>
        public  List<string> GetSheetSetDrawings(string DstFileFullName)
        {
            List<string> x = new List<string>();
            
            
            //********************
            // Получаем менеджера подшивки
            AcSmSheetSetMgr mgr = new AcSmSheetSetMgr();
            // Создаём новый объект базы данных подшивки
            AcSmDatabase db = new AcSmDatabase();

            // Пытаемся загрузить dst-файл 
            try
            {
                db = mgr.OpenDatabase(DstFileFullName, false);
              
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nНе удалось открыть подшивку - возможно она кем-то открыта в данный момент");
                ed.WriteMessage(ex.ToString());
                return null;
            }

            try
            {
                // На время блокируем базу данных подшивки от изменения извне
                db.LockDb(db);

                AcSmSheetSet ss = db.GetSheetSet();
                id_Sheet = ss.GetObjectId().GetHandle();
                ProcessEnumerator(ss.GetSheetEnumerator(), ref x);
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nНе удалось заблокировать подшивку - возможно она кем-то открыта в данный момент");
                ed.WriteMessage("\n" + ex.Message);
            }
            //Снимаем блокировку базы данных подшивки
            finally
            {
                db.UnlockDb(db, true);
                mgr.Close(db);
            }
            return x;
        }


        /// <summary>
        /// Извлечение полных имён файлов, включенных в состав подшивки
        /// </summary>
        /// <param name="iter">Родительский объект</param>
        /// <param name="x">ссылка на объект List<FileInfo>, в котором инкапсулирован результат</param>
        void ProcessEnumerator(IAcSmEnumComponent iter, ref List<string> x)
        {
            IAcSmComponent item = iter.Next();
            while (item != null)
            {
                string type = item.GetTypeName();
                switch (type)
                {
                    //Группа листов (рекурсивная обработка, т.к. может содержать вложенные группы листов)
                    case "AcSmSubset":
                        try
                        {
                            AcSmSubset subset = (AcSmSubset)item;
                            string subName = subset.GetName();

                            if (!String.IsNullOrEmpty(subName))
                            {
                                IAcSmEnumComponent enumerator = (IAcSmEnumComponent)subset.GetSheetEnumerator();
                                ProcessEnumerator(enumerator, ref x);
                            }
                        }
                        catch { }
                        break;

                    //Лист
                    case "AcSmSheet":
                        try
                        {
                            AcSmSheet sh = (AcSmSheet)item;

                            //Создаём строку: Номер листа/ Название листа/ Название файла/ id подшивки/ id листа подшивки/ маска листа в файле
                            string t = sh.GetNumber() + "&"+ sh.GetName() + "&" + sh.GetLayout().GetFileName() + "&" + id_Sheet + "&" + sh.GetObjectId().GetHandle() + "&" + sh.GetLayout().GetAcDbHandle();
                            x.Add(t);
                            //x.Add(new FileInfo(sh.GetLayout().GetObjectId().GetHandle()));
                            if (!String.IsNullOrEmpty(sh.GetName()))
                            {
                                IAcSmEnumComponent enumerator = (IAcSmEnumComponent)sh.GetSheetViews();
                                ProcessEnumerator(enumerator, ref x);
                            }
                        }
                        catch { }
                        break;
                }
                item = iter.Next();
            }
        }
    }
}


Единственное на строчке db = mgr.OpenDatabase(DstFileFullName, false); выдавало пару раз ошибку, видимо как раз из-за того,
что подшивка уже была открыта.
Вложения
Тип файла: rar SheetSet.rar (89.5 Кб, 82 просмотров)
молодой человек вне форума  
 
Непрочитано 24.05.2012, 21:31
#17
hwd

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


Цитата:
Сообщение от молодой человек Посмотреть сообщение
Класс DrawingSearcher в общем-то практически не отличается от того что вы выкладывали у себя на сайте.
Если мне не изменяет память, то обозначенный выше код старый, и я сталкивался с проблемой обозначенной тобой. Затем подправил код и проблема исчезла (там было что-то простое). Но насколько я помню - на сайте я ничего не обновлял, т.е. там код остался прежним. Напомни завтра - я поищу на работе исправленный вариант и скину тебе.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 04.02.2014, 20:13
#18
shmulka

Инженер-электрик
 
Регистрация: 08.08.2013
Нижний Новгород
Сообщений: 131


Скажите, эта ветка вылилалсь в какое-либо приложение:
shmulka вне форума  
 
Непрочитано 05.02.2014, 17:47
#19
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от shmulka Посмотреть сообщение
Скажите, эта ветка вылилалсь в какое-либо приложение:
Вот ответ:
Цитата:
Сообщение от молодой человек Посмотреть сообщение
Написал программку, которая считывает нужную мне информацию из подшивки (за что спасибо hwd).
Цитата:
Сообщение от hwd Посмотреть сообщение
Если мне не изменяет память, то обозначенный выше код старый, и я сталкивался с проблемой обозначенной тобой. Затем подправил код и проблема исчезла (там было что-то простое). Но насколько я помню - на сайте я ничего не обновлял, т.е. там код остался прежним. Напомни завтра - я поищу на работе исправленный вариант и скину тебе.
Очевидно что молодой человек написал для себя нужное приложение.
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Работа с подшивкой.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Устанавливаемые атрибуты в динамическом блоке и работа с подшивкой. Dmitriy_Altproekt Динамические блоки 45 09.12.2015 10:38
Акты скрытых работ Витос Прочее. Архитектура и строительство 324 05.03.2015 12:24
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19
LISP: работа с буфером обмена с помощью VLisp Torino LISP 14 23.06.2005 13:16