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

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

VBA. Программная вставка внешней ссылки. Ошибка в A2012..

Ответ
Поиск в этой теме
Непрочитано 29.08.2012, 12:54 #1
VBA. Программная вставка внешней ссылки. Ошибка в A2012..
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,686

Собственно, вот оно код, вставляющий нужный мне файл внешней ссылкой, "биндящий" его, и после удаляющий блок и описание блока..
Код:
[Выделить все]
...
Dim I_Point(0 To 2) As Double
  I_Point(0) = 0: I_Point(1) = 1: I_Point(2) = 0
  Dim Block_P As AcadExternalReference
  If ThisDrawing.FullName <> path Then
    Set Block_P = ThisDrawing.ModelSpace.AttachExternalReference(path, "ёклмн", I_Point, 1, 1, 1, 0, False)
    ThisDrawing.Blocks.Item(Block_P.Name).Bind True
    Block_P.Delete
    ThisDrawing.Blocks.Item("ёклмн").Delete
End If
Не берусь судить, насколько правильно написан, но в 2008 работает нормально, в 2012 тормозит на строке Block_P.Delete, ругаясь вот такими окнами:


Может, кто знает, где собака зарылась?

Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.JPG
Просмотров: 621
Размер:	10.3 Кб
ID:	86220  

__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 8890
 
Непрочитано 30.08.2012, 09:18
#2
hwd

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


Не VBA, но по комментам разобраться не составит труда. Код протестирован в AutoCAD 2013 Enu x64.
Код:
[Выделить все]
using System;
using System.IO;
using acad = Autodesk.AutoCAD.ApplicationServices.Application;
using AcApp = Autodesk.AutoCAD.ApplicationServices;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using AcGm = Autodesk.AutoCAD.Geometry;
using AcRtm = Autodesk.AutoCAD.Runtime;

[assembly: AcRtm.CommandClass(typeof(XReferenceSamples.Class1))]

namespace XReferenceSamples
{
    public class Class1
    {
        [AcRtm.CommandMethod("XAttach-From-CSharp", AcRtm.CommandFlags.Modal)]
        public void XAttach_From_CSharp()
        {
            AcApp.Document doc = acad.DocumentManager.MdiActiveDocument;
            AcDb.Database db = doc.Database; 
            //Подключаем DWG файл в качестве внешней ссылки
            AcDb.ObjectId xRefId = db.AttachXref(Path.Combine(Environment.GetFolderPath(
                Environment.SpecialFolder.MyDocuments), "XRef.dwg"), "myXref");
            using (AcDb.Transaction tr = db.TransactionManager.StartTransaction())
            {
                //Создаём экземпляр вхождения блока для подключенной ссылки
                AcDb.BlockReference br = new AcDb.BlockReference(new AcGm.Point3d(0, 0, 0), xRefId);
                AcDb.BlockTable blockTable = (AcDb.BlockTable)tr.GetObject(db.BlockTableId, AcDb.OpenMode.ForRead);
                //Вставлять вхождение блока будем в пространстве Model
                AcDb.BlockTableRecord modalSpace = (AcDb.BlockTableRecord)
                    tr.GetObject(blockTable[AcDb.BlockTableRecord.ModelSpace], AcDb.OpenMode.ForWrite);
                modalSpace.AppendEntity(br);
                tr.AddNewlyCreatedDBObject(br, true);                                             
                tr.Commit();
            }
            //Внедряем содержимое ссылки в чертёж
            //ВНИМАНИЕ!
            //Следующий фрагмент кода должен находиться ПОСЛЕ блока "using", т.к. должен быть выполнен 
            //после строки кода tr.Commit(); (т.е. когда изменения будут зафиксированы в базе данных)
            AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();            
            ids.Add(xRefId); 
            db.BindXrefs(ids, true);  
        }
    }
}
Заметь: в отличие от тебя, я не вызываю в коде никакого удаления поскольку в этом нет необходимости...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 30.08.2012 в 09:27.
hwd вне форума  
 
Непрочитано 30.08.2012, 18:52
#3
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Если эта махинация нужна для получения блоков из другого чертежа, то может использовать CopyObjects?
Сейчас немного не в теме, но помню делал так же именно для этого), и сейчас не могу вспомнить почему не использовал CopyObjects.
Vildar вне форума  
 
Автор темы   Непрочитано 03.09.2012, 12:28
#4
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от Vildar Посмотреть сообщение
Если эта махинация нужна для получения блоков из другого чертежа, то может использовать CopyObjects?
Сейчас немного не в теме, но помню делал так же именно для этого), и сейчас не могу вспомнить почему...
Vildar, если не ошибаюсь, когда-то этот способ я тебе и посоветовал..
Цитата:
Сообщение от hwd Посмотреть сообщение
Не VBA, но по комментам разобраться не составит труда...
hwd, спасибо, конечно... Но не VBA! Я, увы, в свете Net до сих пор человек темный... Offtop: "ты не мудри, ты пальцем покажи!" Код я рассматриваю как аналог выполнения последовательности "обычных" команд автокада, не вникая в сущность работы с базой данных объектов чертежа. То есть, - вставил нужный файл внешней ссылкой, внедрил, получил вхождение блока. Потом удалил - сначала вхождение блока, затем описание. Вот и вся вроде бы нехитрая любовь, - описания блоков из "вставляемого" файла переносятся в текущий. Способ, может, не лучший, но простой. Почто в А2008 работает, в А2012 нет?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 12:41
#5
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Потом удалил - сначала вхождение блока, затем описание.
Что-то я не пойму тебя... Тебе нужен Bind для внешней ссылки, или что-то иное? Зачем ты сначала "биндишь", а потом удаляешь созданные при биндинге вхождения блока и их определения? Какая-то странная у тебя "любовь" (с)...
Если тебе всего лишь нужно из др. чертежа импортировать определения интересующих тебя блоков (или стилей/типов линий/слоёв), то это делается совсем иначе (и проще), безо всяких там биндингов. По указанной ссылке - код на C#. Примеры на VBA ищи сам.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 03.09.2012 в 12:49.
hwd вне форума  
 
Автор темы   Непрочитано 03.09.2012, 12:54
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от hwd Посмотреть сообщение
Что-то я не пойму тебя... Тебе нужен Bind для внешней ссылки, или что-то иное? Зачем ты сначала "биндишь", а потом удаляешь созданные при биндинге вхождения блока и их определения? Какая-то странная у тебя "любовь" (с)...
Вся эта "странная любовь" - имеет целью перенос описаний блоков из одного файла в другой.. Сам блок, созданный при биндинге, убивается, а "пять тыщ восемсот" блоков, живших во "вставляемом" файле, сохраняются..
Я понимаю, что это можно сделать совсем иначе, "правильней" и так далее.. Но работало же!
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 12:55
#7
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Вся эта "странная любовь" - имеет целью перенос описаний блоков из одного файла в другой.. Сам блок, созданный при биндинге, убивается, а "пять тыщ восемсот" блоков, живших во "вставляемом" файле, сохраняются..
ещё раз прочти мой предыдущий msg (я там позднее добавил информацию - наверное ты её не увидел). Не забывай, что биндинг тебе помимо определений блоков внедряет и стили/слои/типы линий. Т.е. кучу того, что тебе может быть совершенно не нужно.

UPD
Цитата:
Я понимаю, что это можно сделать совсем иначе, "правильней" и так далее.. Но работало же!
Не тот ли это случай, когда работало в AutoCAD 2008 x86, а перестало в AutoCAD 2012 x64?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 03.09.2012 в 13:04.
hwd вне форума  
 
Автор темы   Непрочитано 03.09.2012, 13:05
#8
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от hwd Посмотреть сообщение
ещё раз прочти мой предыдущий msg (я там позднее добавил информацию - наверное ты её не увидел). Не забывай, что биндинг тебе помимо определений блоков внедряет и стили/слои/типы линий. Т.е. кучу того, что тебе может быть совершенно не нужно.
hwd, да я знаю. Лишних стилей/слоев/типов линий там нет, - файл используется именно как "хранилище" блоков. Метод мой, конечно, не профессиональный, - но использовал я его во всех своих прогах, где нужно перекинуть описания блоков из одного "архивного" файла в рабочий.
Цитата:
Не тот ли это случай, когда работало в AutoCAD 2008 x86, а перестало в AutoCAD 2012 x64?
Для А2012/2013 не работает как в 64b, так и в 32b. Для А2010 - работает и там, и там...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 03.09.2012 в 13:23.
AlexV вне форума  
 
Непрочитано 03.09.2012, 13:06
#9
hwd

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


Цитата:
Сообщение от AlexV Посмотреть сообщение
hwd, да я знаю. Лишних стилей/слоев/типов линий там нет, - файл используется именно как "хранилище" блоков. Метод мой, конечно, не профессиональный, - но использовал я его во всех своих прогах, где нужно перекинуть описания блоков из одного "архивного" файла в рабочий.
и снова см. предыдущий "UPD".
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 03.09.2012, 13:25
#10
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от hwd Посмотреть сообщение
Не тот ли это случай, когда работало в AutoCAD 2008 x86, а перестало в AutoCAD 2012 x64?
Цитата:
Сообщение от hwd Посмотреть сообщение
и снова см. предыдущий "UPD".
повторюсь:
Для А2012/2013 не работает как в 64b, так и в 32b. Для А2010 - работает и там, и там... А2008 - под 32 работает, под 64 нету у меня такого..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 13:55
#11
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от AlexV Посмотреть сообщение
когда-то этот способ я тебе и посоветовал..
Да. Тему бы надо найти, чем там дело кончилось, интересно.

Так что думаешь про CopyObjects?
По ссылке на блог KEAN WALMSLEY, которую Андрей дал, используется WblockCloneObjects, а его аналог на VBA как раз CopyObjects, ЕМНИП!
Vildar вне форума  
 
Автор темы   Непрочитано 03.09.2012, 14:33
#12
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от Vildar Посмотреть сообщение
Да. Тему бы надо найти, чем там дело кончилось, интересно.
Так что думаешь про CopyObjects?
По ссылке на блог KEAN WALMSLEY, которую Андрей дал, используется WblockCloneObjects, а его аналог на VBA как раз CopyObjects, ЕМНИП!
Да я на работе работу работаю, так что по ссылкам меня можно послать только на dwg.ru. Не знаю, когда-то давно, когда искал способы переноса описаний блоков, "внешней ссылкой" оказался наиболее доступным моему пониманию и простым. А CopyObjects,- он не предпологает необходимости открывать исходный файл?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 14:55
#13
Кулик Алексей aka kpblc
Moderator

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


Предполагает, насколько я помню. Через ObjectDBX придется идтить
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.09.2012, 14:55
#14
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от AlexV Посмотреть сообщение
А CopyObjects,- он не предпологает необходимости открывать исходный файл?
Да нужно открыть. Но, можно открывать через dbx (без gui).
Vildar вне форума  
 
Автор темы   Непрочитано 03.09.2012, 15:05
#15
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Предполагает, насколько я помню. Через ObjectDBX придется идтить
Вот, в том то и дело.. Когда я начал пытаться программировать, мне тоже говорили: нужно пойти туда, не знаю куда, принести то, не знаю что.. А с внешней ссылкой - бац, и в дамки, никаких заморочек, никаких ошибок.. до поры до времени. Мне этот вариант показался проще не бывает. Само собой, когда нужно таскать заранее неизвестно что неизвестно откуда неизвестно куда - он не очень хорош, - весь возможный мусор каждый раз ловить. А если файл архива один и вычищен от лишнего, то все окей.
И тем не менее, в чем ошибка-то для А2012? Какой "базы данных нет"?
Кстати, справка по VBA исчезла из А2012, да и вообще, какая-то убогая она стала..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 15:06
#16
hwd

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


Не путайте его, он и сам запутается
Цитата:
он не предпологает необходимости открывать исходный файл?
Он не предполагает создания объекта Document, который визуально у тебя будет представлен как чертёж. Но он предполагает создание объекта Database, путём считывания содержимого базы данных того чертежа, в котором ты хранишь описание своих блоков.
Цитата:
Вот, в том то и дело.. Когда я начал пытаться программировать, мне тоже говорили: нужно пойти туда, не знаю куда, принести то, не знаю что.. А с внешней ссылкой - бац, и в дамки, никаких заморочек, никаких ошибок.. до поры до времени. Мне этот вариант показался проще не бывает. Само собой, когда нужно таскать заранее неизвестно что неизвестно откуда неизвестно куда - он не очень хорош, - весь возможный мусор каждый раз ловить. А если файл архива один и вычищен от лишнего, то все окей.
И тем не менее, в чем ошибка-то для А2012? Какой "базы данных нет"?
Вместо того, чтобы упереться в эту проблему, ты бы лучше разобрался в том, как это следует делать. И для себя будет полезно на будущее, и проблема будет решена. А принципиально уперевшись в вопрос
Цитата:
в чем ошибка-то для А2012? Какой "базы данных нет"?
ты так будешь сидеть долго и безрезультатно, потому как вряд ли кто-то захочет тратить своё время на решение проблемы, обусловленной нежеланием/неумением использования того подхода, который для этого предназначен.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 03.09.2012 в 15:12.
hwd вне форума  
 
Автор темы   Непрочитано 03.09.2012, 16:28
#17
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от hwd Посмотреть сообщение
Вместо того, чтобы упереться в эту проблему, ты бы лучше разобрался в том, как это следует делать. И для себя будет полезно на будущее, и проблема будет решена. А принципиально уперевшись в вопрос...ты так будешь сидеть долго и безрезультатно, потому как вряд ли кто-то захочет тратить своё время на решение проблемы, обусловленной нежеланием/неумением использования того подхода, который для этого предназначен.
Это все понятно, я уяснил про Offtop: "черти в масштабе 1:1... программируй в правильном стиле... позвони родителям... не пей из копытца, козленочком станешь...", но автокад же предпологает массу вариантов и подходов для решения одной и той же задачи, почему же в программировании нельзя? Да и название темы-то как раз о конкретной ошибке в конкретном коде, а не о правильных методах перенесения описаний блоков из файла в файл.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 03.09.2012, 17:24
#18
Кулик Алексей aka kpblc
Moderator

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


AlexV, у меня сейчас башка другим забита, поэтому сильно ногами прошу не пинать. А если сделать сначала Bind, потом объекту Explode, и только потом уже Erase на вхождение блока и Delete на описание?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.09.2012, 17:28
#19
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


фигню написал
Vildar вне форума  
 
Автор темы   Непрочитано 03.09.2012, 17:35
#20
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,686


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
AlexV, у меня сейчас башка другим забита, поэтому сильно ногами прошу не пинать. А если сделать сначала Bind, потом объекту Explode, и только потом уже Erase на вхождение блока и Delete на описание?
Пробовал, эксплодить тоже не дает.. "неприменимо", понимаешь.. Была мысля попробовать ThisDrawing.SendCommand ("_ERASE _P"), ведь командами автокада нормально блок и взрывается, и стирается... Только как сослаться на этот блок в командной строке?
На самом деле, с этим объектом, который опосля Bind живет в "Block_P", вообще ни хрена не сделать обычными для "AcadExternalReference" методами через VBA. Ни copy, ни move, - ничего его не берет.
Видно, много чего поменялось в объектной модели автокада 2012..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 03.09.2012 в 17:44.
AlexV вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Программная вставка внешней ссылки. Ошибка в A2012..

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите узнать номер строки в котрой произошла ошибка в программе на VBA МишаИнженер Программирование 3 27.05.2012 23:27
VBA: Вставка блока - ошибка файлера (filer error) vlalexey Программирование 4 09.11.2010 12:13
Несоответствие результатов в Лире s.vas Лира / Лира-САПР 19 11.11.2009 07:31
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47