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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сохранить в DOC файл, OLE2Frame объект Word вставленный в DWG?

Как сохранить в DOC файл, OLE2Frame объект Word вставленный в DWG?

Ответ
Поиск в этой теме
Непрочитано 25.05.2012, 16:10 #1
Как сохранить в DOC файл, OLE2Frame объект Word вставленный в DWG?
Enion
 
Регистрация: 25.05.2012
Сообщений: 12

Доброго времени суток!
Необходимо извлечь из Autocad файла вставленный в него Word документ как OLE2Frame объект и сохранить его на диск как doc файл.
Этот фокус необходимо проделать через API автокада. Т.к. я работаю с автокадом из Delphi.
Спасибо всем помогающим и сочувствующим.
Просмотров: 8715
 
Автор темы   Непрочитано 28.05.2012, 17:52
#2
Enion


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


Весь день копал интернет, нашел вот такой примерчик открытия Excel документа интегрированного в AutoCAD.
Sub TestItOut()
Dim testEnt As AcadEntity, pkPnt As Variant
ThisDrawing.Utility.GetEntity testEnt, pkPnt
If testEnt.ObjectName = "AcDbOle2Frame" Then _
openOle (testEnt.Handle)
End Sub

Sub openOle(entHandle As String)
Dim qM As String
qM = """"
ThisDrawing.SendCommand _
"(command " & qM & "SELECT" & qM & ") " & _
"(handent " & qM & entHandle & qM & ") " & _
"(command " & qM & "OLEOPEN" & qM & ") "
DoEvents
End Sub
Но у меня и этот фокус не выходит. Судя по коду по команде handent должен OLE объект должен выделиться чтобы затем его открыть командой OLEOPEN. Но этого не происходит.
Помогите кто может!
Enion вне форума  
 
Непрочитано 28.05.2012, 20:34
#3
Олег (jr.)

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


Попробуй другой синтаксис:

Код:
[Выделить все]
Sub TestItOut()
 Dim testEnt As AcadEntity, pkPnt As Variant
 ThisDrawing.Utility.GetEntity testEnt, pkPnt
 If testEnt.ObjectName = "AcDbOle2Frame" Then _
 openOle (testEnt.Handle)
 End Sub
 
Sub openOle(entHandle As String)
 Dim qM As String
 qM = """"
 ThisDrawing.SendCommand _
 "(command " & qM & "SELECT" & qM & " " & _
 "(handent " & qM & entHandle & qM & ") " & qM & qM & _
 " " & qM & "OLEOPEN" & qM & ") "
 DoEvents
 End Sub
~'o'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 29.05.2012, 09:49
#4
Enion


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


Олег (jr.), Спасибо большое! Сработало. Сейчас на Delphi у меня это выглядит так:
AcadApplication.ActiveDocument.SendCommand('(command "_SELECT" (handent "'+AcadObject.Handle+'") "" "_OLEOPEN")'+chr(13));
При выполнении OLE объект открывается в Word-е.
Остаются следующие проблемы:
1)При выполнении команды AutoCad визуализируется (на экране открывается окно AutoCad). При выполнении программы AutoCad должен оставаться в фоновом режиме.
2)В конечном итоге мне необходимо сохранить OLE объект в doc файл, а пока я научился только его открывать.
Поиски продолжаются, надеюсь я иду в правильном направлении. Если у кого есть идеи буду очень благодарен.
Enion вне форума  
 
Непрочитано 29.05.2012, 20:24
#5
Олег (jr.)

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


Я к сожалению ничего не знаю как достать содержимое
OLE объекта, извини

~'o'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 30.05.2012, 14:43
#6
Enion


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


Почти получилось.
Копирую в буфер обмена OLE объект Word командой:
AcadApplication.ActiveDocument.SendCommand('(command "_copyclip" (handent "'+AcadObject.Handle+'") "")'+chr(13));
И затем вставляю содержимое буфера в Word документ.
НО! Данная команда выполняется только 1 раз нормально. при втором выполнении вываливается ошибка автокада. Причём если её выполнить прям в командной строке AutoCad, то первое выполнении проходит без единой зацепки, сразу после выполнения в буфере оказывается фрагмент Word документа. А вот при втором выполнении (если в dwg файле несколько OLE объектов) выдаёт надпись <имя объекта:7EFD42D8> и ждёт ещё каких то действий "Enter" или "Esc"... По "Esc" вообще выдаёт надпись "Ошибка: функция отменена"...
Знатоки Lisp-a помогите пожалуйста!
Тут есть знатоки AutoLisp?

Последний раз редактировалось Enion, 31.05.2012 в 14:45.
Enion вне форума  
 
Непрочитано 06.06.2012, 15:56
#7
hwd

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


Засунуть в память оле объекты из чертежа можно так (для AutoCAD 2010-2012):
Код:
[Выделить все]
[DllImport("mfc90u.dll", CallingConvention = CallingConvention.ThisCall, EntryPoint = "#1572")]
public static extern void COleClientItem_CopyToClipboard(IntPtr thisClientItem, int bIncludeLink);

[DllImport("acdb18.dll", CallingConvention = CallingConvention.ThisCall, 
	EntryPoint = "?getOleClientItem@AcDbOle2Frame@@QEBAPEAVCOleClientItem@@XZ")]
public static extern IntPtr AcDbOle2Frame_getOleClientItem(IntPtr thisOle2Frame);

[CommandMethod("c2c")]
public static void Copy2Clipboard() {
	Document doc = Application.DocumentManager.MdiActiveDocument;
	Editor ed = doc.Editor;
	Database db = doc.Database;

	using (Transaction t = db.TransactionManager.StartTransaction()) {
		BlockTableRecord bt = t.GetObject(db.CurrentSpaceId, OpenMode.ForRead) as BlockTableRecord;
		foreach (ObjectId id in bt) {
			if (id.ObjectClass.Name != "AcDbOle2Frame")
				continue;
			Ole2Frame oleFrame = t.GetObject(id, OpenMode.ForRead) as Ole2Frame;
			IntPtr ptrClientItem = AcDbOle2Frame_getOleClientItem(oleFrame.UnmanagedObject);
			COleClientItem_CopyToClipboard(ptrClientItem, 0);
		}
		t.Commit();
	}
}
Обрати внимание на версию автокада - под иные версии точки входа будут иными.

UPD
Для AutoCAD 2009 импортируемые функции следует определять так:
Код:
[Выделить все]
[DllImport("mfc80u.dll", CallingConvention = CallingConvention.ThisCall, EntryPoint = "#1532")]
public static extern void COleClientItem_CopyToClipboard(IntPtr thisClientItem, int bIncludeLink);

[DllImport("acdb17.dll", CallingConvention = CallingConvention.ThisCall,
	EntryPoint = "?getOleClientItem@AcDbOle2Frame@@QBEPAVCOleClientItem@@XZ")]
public static extern IntPtr AcDbOle2Frame_getOleClientItem(IntPtr thisOle2Frame);
Для AutoCAD 2013 смогу получить только дома, т.к. 2013-й установлен там.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 07.06.2012 в 13:16.
hwd вне форума  
 
Непрочитано 28.03.2013, 09:15
#8
rglx74


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


Приветствую и прошу прощения за оффтоп! Подскажите способ извлечения OLE (excel) объектов из чертежей dwg / dxf. Заранее СПАСИБО!
rglx74 вне форума  
 
Непрочитано 28.03.2013, 10:32
#9
hwd

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


Цитата:
Сообщение от rglx74 Посмотреть сообщение
Приветствую и прошу прощения за оффтоп! Подскажите способ извлечения OLE (excel) объектов из чертежей dwg / dxf. Заранее СПАСИБО!
Способ показан в #7 и ты это видел. Тебе остаётся извлечь то, что засунуто в буфер обмена (это аналог Ctrl + C, Ctrl + V).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 28.03.2013 в 10:38.
hwd вне форума  
 
Непрочитано 29.03.2013, 07:52
#10
rglx74


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


hwd, Спасибо, а чем может быть вызвана ошибка "Не удается запустить приложение на сервере", после клика на объекте?
rglx74 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сохранить в DOC файл, OLE2Frame объект Word вставленный в DWG?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить файл dwg в pdf ??? eclipse AutoCAD 64 30.06.2011 10:47
Вставленный в dwg растр *.jpg не выделяется как объект. vitalill AutoCAD 3 03.05.2011 13:56
Word 2007/2010 не открывает объект AutoCAD 2009 Andersenqwer Прочее. Программное обеспечение 3 20.12.2010 21:46
Какой программой редактировать файл dwg формата pavelP2009 AutoCAD 1 24.07.2009 19:41
Каким методом можно загрузить DWG файл? Trifon Программирование 1 21.01.2009 22:58