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

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

Аналог вызова но без загрузки приложения

Ответ
Поиск в этой теме
Непрочитано 24.03.2009, 18:03 #1
Аналог вызова но без загрузки приложения
lexluther
 
Регистрация: 19.03.2009
Сообщений: 51

Всем привет,

Я пишу внешнее абсолютно не связанное с АвтоКАД (разве что через КОМ вызовы) приложение цель которого загрузить модель AutoCAD и проекспортировать ее в формате BMP. Вопрос как это сделать?

Я нашел следующий вариант:

Код:
[Выделить все]
using Autodesk.AutoCAD.Interop.Common;
using Autodesk.AutoCAD.Interop;
 
namespace WpfApplication
{
    public partial class MyWindow : Window
    {
        public MyWindow()
        {
        }
        private void buttonLoadExternally_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                InitializeComponent();
                AcadApplication AA = new AcadApplicationClass();
                AcadDocument AD = AA.Documents.Open(Directory.GetCurrentDirectory() + @"\test.dwg", false, null);
                AcadSelectionSet ASS = AD.SelectionSets.Add("LabelMark91A44A65-405C-4f31-A462-0390A6722298ArtemVyrtosu");
 
                AD.Export(Directory.GetCurrentDirectory() + @"\test", "bmp", ASS);
                AA.Quit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, ex.Source);
            }
        }
    }
}
Проблема в том что при вызове загружается окно Автокада и перехватывает управление на себя. Как это предотвратить? Автокад должен быть по крайней мере абсолютно невидим пользователю, чтоб он знал только то что он должен быть установлен, не больше. Объект
AxDbDocument сохраняет файл но превращать его в рисунок BMP не умеет. Что мне делать чтобы достичь желаемого?

С уважением.

Еще один мой топик по смежной теме: http://forum.dwg.ru/showthread.php?t=32027

Последний раз редактировалось lexluther, 25.03.2009 в 12:58. Причина: Как исправить заголовок темы на "Аналог вызова AcadDocument.Export но без загрузки приложения"?
Просмотров: 3806
 
Непрочитано 25.03.2009, 01:46
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


А если (втупую) попробовать объекту AA установить Visible = false? Не уверен, что такое свойство у него есть...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.03.2009, 09:31
#3
nik_mb

конструктор
 
Регистрация: 23.03.2009
Волгоград
Сообщений: 120


Думаю, что придется загружать автокад, сделав его невидимым (по типу лисповских строк)
Код:
[Выделить все]
(setq AcadObject (vlax-get-acad-object)) ;получить объект Application
(vlax-put-property AcadObject "Visible" :vlax-false) ;убрать сеанс с экрана
и с его помощью экспортировать в ВМР, временно передав управление.
nik_mb вне форума  
 
Непрочитано 25.03.2009, 09:56
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Загрузить AutoCAD через COM в виде "невидимого" приложения, да ещё чего-то в нем сделать - не получится. Это слишком сложная система, обычные методы, которые легко проходят с другими COM-серверами, здесь не пролазят.

Впрочем, про самые последние версии не знаю, не проверял.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 25.03.2009, 10:32
#5
lexluther


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


Дайте мне пожалуйста метод лиспа который будет выбирать текущую диаграмму и экспортировать ее в BMP, а потом закрыть приложение. Такое ж я думаю можно сделать? COM интерфейс позволяет насколько я знаю запускать выражения на лиспе? Задача очень поджимает, буду век благодарен, и обещаю потом сам вызубрить весь автокад.
lexluther вне форума  
 
Непрочитано 25.03.2009, 11:39
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


COM позволяет "запустить" выражение на LISP только послав его в виде строки методом SendCommand. Ничего серьезного там не сделаешь, разве что послать загрузку программы, которая что-то делает, или запуск уже загруженной функции с аргументами.

Естественно, нет никакого "метода лисп" выбирающего какую-то диаграмму и экспортирующего в BMP. Есть в COM у объекта Document метод Export с аргументами FileName, Extension, SelectionSet. Вот его и надо копать. SelectionSet, естественно, самое сложное.

Правильнее делать основную программу внутри LISP, из неё запускать при необходимости стороннее приложение, которое что-то делает, и из LISP же и экспортировать. Непонятно только зачем вообще задействовать AutoCAD для экспорта какой-то диаграммы в BMP.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 25.03.2009, 12:14
#7
lexluther


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


Просто суть программы (немогу выдавать коммерч тайну), в том чтобы на визуальный объект типа документ (определенного формата например А5, ну там пользовательский), позволять размещать изображения, текст, баркоды, и.т.д.. Не суть важно. Мне нужно написать функционал по размещению на нем автокадовского изображения. НЕ диаграммы. Для этого мне нужно внутри конвертануть авто кадовское изображение а потом перенести изображение на документ. Проект на американцев в одной из самых крупных компаний страны, потому боюсь что то детальнее писать с меня 50 штук штрафа иначе снимут по договору.

Мне осталось только конвертануть изображение.

Вопрос если на лиспе написать выражение конвертации и сохранения, и оно в моем случае сработает, помогите пожалуйта хоть наводкой как его написать. Мне просто чтобы сохранить БМП во временную локацию, А потом я его си шарпом обработаю уже.
lexluther вне форума  
 
Непрочитано 25.03.2009, 12:28
#8
RomAnKin


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


Код:
[Выделить все]
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Imports System.Windows.Forms
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Object
'CMA Notes: AutoCAD and AutoDesk are copyrighted names by their owners, and any and all code used is for learning
' and demonstartion purposes.  The user of this code assumes any and all risk resulting from it's use.

Public Class DWG_to_WMF
    Public WithEvents AcadApp As Autodesk.AutoCAD.Interop.AcadApplication
    Dim acadDoc As Autodesk.AutoCAD.Interop.AcadDocument
    Dim acadSelectset As Autodesk.AutoCAD.Interop.AcadSelectionSet
    Dim temp_complete_filename_path As String
    Dim Top_Level_Folder As String
    Dim sImage_Type As String
    Dim sSave_Folder_Path As String
    Dim sfileName_Only_No_Path As String

    Public Sub GetAcadApplication()
        Try
            AcadApp = GetObject(, "AutoCAD.Application.17.2")  '17.2 For AutoCAD 2009, differs for other versions.
            AcadApp.Visible = True
        Catch
            Try
                AcadApp = CreateObject("AutoCAD.Application.17.2")
                AcadApp.Visible = True
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.Critical)
                Exit Sub
            End Try
        End Try
    End Sub
    Private Sub Pick_Folder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pick_Folder.Click
        If Folder_Source_DWG.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Top_Level_Folder = Folder_Source_DWG.SelectedPath
        End If
        Dim fileNames As String()

        If Include_Subfolders.Checked = True Then
            fileNames = Directory.GetFiles(Top_Level_Folder, "*.dwg", SearchOption.AllDirectories)
        Else
            fileNames = Directory.GetFiles(Top_Level_Folder, "*.dwg", SearchOption.TopDirectoryOnly)
        End If

        ' This grabs all *.dwg files in either the top level folder or top level folder and all sub folders
        ' depending on the value of Include_Subfolders checkbox.
       
        Call GetAcadApplication()
        For Each fileName As String In fileNames
            Try
                acadDoc = AcadApp.ActiveDocument
            Catch
                acadDoc = AcadApp.Documents.Add
            End Try
            ProcessDwg(fileName)
        Next
    End Sub

    Sub ProcessDwg(ByVal ThisDwg As String)
        Dim sImage_Output_File As String = ""
        sfileName_Only_No_Path = ""
        Try
            acadDoc.Application.Documents.Open(ThisDwg) 'Opens file in variable ThisDwg Ex c:\test.dwg
        Catch ex As Exception
            MsgBox("Error Opening drawing." & vbCrLf & ex.ToString)
        End Try
        acadDoc = AcadApp.ActiveDocument
        AcadApp.ZoomExtents()  'may not be needed since selection set selects "ALL"
        Dim ssetObj As AcadSelectionSet
        ssetObj = acadDoc.SelectionSets.Add("SS02") ' creates selection set object
        ssetObj.Select(AcSelect.acSelectionSetAll)    'puts everything into the selection set object
        ' To Do : Add selection set option to pick specific Layer(s), & only their contents will go to the WMF. 
        If File_Output_Different_Than_dwg.Checked = True Then ' handles logic of where to save image files
            'Image files will be saved to a different folder than where the original DWG files are located.
            sfileName_Only_No_Path = Path.GetFileName(ThisDwg)
            sImage_Output_File = sSave_Folder_Path & "\" & sfileName_Only_No_Path
        Else
            sImage_Output_File = ThisDwg  'Image files will be saved in same folder as DWG files.
        End If
        acadDoc.Export(sImage_Output_File, sImage_Type, ssetObj)
        ' use sImage_Output_File as path and filename to save the Image file
        ' use sImage_Type variable to chose WMF or BMP.  This adds a .WMF or .BMP to sImage_Output_File
        ' use ssetObj  as the items from drawing that will appear in image file.
        ' Example test.dwg will be exported as test.dwg.wmf
        ' Example c:\test.dwg will now have a WMF saved at c:\test.dwg.wmf
        Try
            acadDoc.Close(False, ThisDwg)
        Catch ex As Exception
            MsgBox("Error closing the drawing." & vbCrLf & ex.ToString)
        End Try
    End Sub

    Private Sub Close_AutoCAD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Close_AutoCAD.Click
        Try
            AcadApp.Quit()
        Catch ex As Exception
            MsgBox("Error closing AutoCAD." & vbCrLf & ex.ToString)
        End Try
    End Sub

    Private Sub DWG_to_WMF_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub WMF_option_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WMF_option.CheckedChanged
        sImage_Type = "WMF"
    End Sub

    Private Sub BMP_Option_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BMP_Option.CheckedChanged
        sImage_Type = "BMP"
    End Sub

    Private Sub File_output_same_as_dwg_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles File_output_same_as_dwg.CheckedChanged
        File_Output_Location.Text = ""
    End Sub

    Private Sub File_Output_Different_Than_dwg_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles File_Output_Different_Than_dwg.CheckedChanged
        If File_Output_Different_Than_dwg.Checked = True Then
            Folder_Alternate_Save_Location.Description = "Select Folder to save image files"
            Folder_Alternate_Save_Location.ShowDialog()
            If System.Windows.Forms.DialogResult.OK Then
                sSave_Folder_Path = Folder_Alternate_Save_Location.SelectedPath.ToString()
                File_Output_Location.Text = sSave_Folder_Path
            ElseIf System.Windows.Forms.DialogResult.Cancel Then
                File_Output_Location.Text = ""
            End If
        End If
    End Sub
End Class

Последний раз редактировалось Кулик Алексей aka kpblc, 25.03.2009 в 19:57.
RomAnKin вне форума  
 
Автор темы   Непрочитано 25.03.2009, 13:00
#9
lexluther


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


Спасибо за код!!! Счас попробую.

Вот есть еще такая идея:

AcadApplication AA;
AcadDocument AD;
AA = newAcadApplicationClass();
AD = AA.Documents.Open(
Directory.GetCurrentDirectory() + @"\test.dwg", false, null);
AA.Visible =
false;
AD.SendCommand(
"BMPOUT"); //тут надо подправить

Вопрос, как подправить комманду BMPOUT чтобы оно сохраняло в выбранное место? Команда скорее всего неправильно мною вызвана, подскажите что не так пожалуйста.
lexluther вне форума  
 
Непрочитано 25.03.2009, 15:55
#10
nik_mb

конструктор
 
Регистрация: 23.03.2009
Волгоград
Сообщений: 120


Опять же в автокаде, при необходимости, надо указать адрес сохранения и выбрать объекты (можно пустой ввод, если сохраняется текущий вид)
(command "_bmpout" "C:\\каталог_сохранения\\картинка.bmp" "")
nik_mb вне форума  
 
Непрочитано 09.05.2010, 17:32
#11
AkaPaul


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


Здравствуйте! Делаю так, ка предложено:
Цитата:
Сообщение от lexluther Посмотреть сообщение
AcadApplication AA;
AcadDocument AD;
AA = newAcadApplicationClass();
AD = AA.Documents.Open(Directory.GetCurrentDirectory() + @"\test.dwg", false, null);
AA.Visible = false;
Но при исполнении вылетает ошибка, что невозможно открыть указанный файл, хотя он существует:
Цитата:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in test.exe

Additional information: Файл C:\aaa.dwf не найден
Использую Autocad 2010, проблем с соединением нет (для проверки вызываю MessageBox с названием и версией AutoCad). Подключены следующие библиотеки

Цитата:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
using System.Runtime.InteropServices;
Как я поимаю нужны только последние 4. Помогите пожалуйста разобраться, диплом горит...
AkaPaul вне форума  
 
Непрочитано 09.05.2010, 17:55
#12
AkaPaul


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


отбой, разобрался
AkaPaul вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Аналог вызова но без загрузки приложения



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение разбитого на слова текста Mist AutoCAD 46 24.05.2020 21:08
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
Автозагрузка приложения до загрузки чертежа Ax3 Программирование 14 15.02.2008 23:29