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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменить текст в Mtext чертежа из другого приложения (VBA)

Изменить текст в Mtext чертежа из другого приложения (VBA)

Ответ
Поиск в этой теме
Непрочитано 07.03.2021, 17:32 #1
Изменить текст в Mtext чертежа из другого приложения (VBA)
lalych
 
Регистрация: 07.03.2021
Сообщений: 10

Привет! У меня есть один вопрос: подключаюсь программно к файлу автокада dwg из программы excel.
C VBA excel знаком более чем. Но объектная модель автокада незнакома.
Вот в чем основная задача:
Есть файл с чертежом, на чертеже есть два поля типа Mtext.
Подскажите пожалуйста, есть ли у объекта MTEXT пользовательское имя, которое я сам могу задать/менять? Ну к примеру системное имя для контрола, к примеру myMtextField1.

А потом, обращаясь из другого приложения к этому имени myMtextField1 менять его содержимое (текст в частности).

Что-то типа такого, открыл нужный файл автокада программно в VBA, нашел свой MTEXT по системному имени, а потом осуществил замену/вставку нового текста типа такого myMtextField1.setText ("Какой то новый текст")
Просмотров: 8280
 
Непрочитано 07.03.2021, 22:34
#2
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Цитата:
Сообщение от lalych Посмотреть сообщение
Но объектная модель автокада незнакома.
изучайте - почти не отличается, если через COM в акад стучаться, только вместо ThisDrawing будет lCurrDoc
Код:
[Выделить все]
  ' Получаем объект акада
  Dim lAcadApp As AcadApplication
  Set lAcadApp = GetObject(, "AutoCAD.Application")
  ' Получаем текущий чертеж
  Dim lCurrDoc As AcadDocument
  Set lCurrDoc = lAcadApp.ActiveDocument
ну и в редакторе VBA подключить Tools -> References: AutoCAD XXXX Type Library для удобства разработки.

----- добавлено через ~6 мин. -----
Цитата:
Сообщение от lalych Посмотреть сообщение
нашел свой MTEXT по системному имени
строковое поле Handle является уникальным внутри одного файла для любого примитива на все время существования этого примитива - привязывайтесь смело через функцию HandleToObject
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.03.2021, 23:26
#3
lalych


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


Спасибо, ну я уже нашел ранее около 10 примеров как открыть файл автокада в excel И с библиотекой в рефференсах тоже разобрался.
Вопрос - как связаться с определенным Mtext , одним из нескольких на странице . Какой у Mtext уникальный идентификатор (имя,или индекс или еще что.)
И как туда,в уже существующий примитив, передать текст. По опыту программиста со стажем более 12 лет могу сказать,когда люди отправляют учить учебник,
в котором (если присмотрется, ничего не говорится про уникальные идентификаторы Mtext по данному вопросу топика.) то они сами не знают ответа)
lalych вне форума  
 
Непрочитано 08.03.2021, 00:10
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Цитата:
Сообщение от lalych Посмотреть сообщение
По опыту программиста со стажем более 12 лет могу сказать,когда люди отправляют учить учебник,
я не знаю, какой у вас опыт программиста - если указанное напрямую решение не видеть:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
строковое поле Handle является уникальным внутри одного файла для любого примитива на все время существования этого примитива - привязывайтесь смело через функцию HandleToObject
сколько нужно лет программировать, чтобы пойти и почитать про Handle и HandleToObject вместо понтов?) Вызывает затруднение сохранить строку с хендлом на листе экселя или что?

Offtop: p.s. хотя если взять отсчет "стажа" программирования с момента написания первой программы с практическим смыслом - то у меня уже почти четверть века оного
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.03.2021, 00:29
#5
lalych


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


Нет, мне из экселя нужно передать в автокад ,в одно из полей (представим ,что таких полей в районе 7 на чертеже) типа Mtext новое текстовое значение.
Как мне указать ,что нужно передавать переменную именно в 3е поле, а не во второе или 1ое?
Что является идентификатором уникальным Mtext на чертеже? Где этот идентификатор можно посмотреть (в свойствах элемента не нашел в автокаде.)

Нужно не искать текст и потом менять его, нужно обратиться к одному из Mtext на чертеже и заполнить его определенными данными.
lalych вне форума  
 
Непрочитано 08.03.2021, 00:45
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Цитата:
Сообщение от lalych Посмотреть сообщение
Где этот идентификатор можно посмотреть (в свойствах элемента не нашел в автокаде.)
хм -> AcadMText.Handle. Как в принципе у любого примитива - хэндл: это primary key базы данных чертежа в файле *.dwg. Пока не удалите примитив - в этом чертеже он будет иметь одно и то же значения во всех сессиях открытия чертежа.

ну а дальше дело техники - надо в экселе хранить два значение: содержимое мультитекста и хэндл примитива-мультитекста. Функцией HandleToObject получить по строке хэндла из первой ячейки примитив мультитекст и ему задать обновленное значение из второй ячейки.
Сергей812 вне форума  
 
Непрочитано 08.03.2021, 02:36
#7
trir


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


Цитата:
Пока не удалите примитив - в этом чертеже он будет иметь одно и то же значения во всех сессиях открытия чертежа.
как мне говорилит умные люди - это не всегда так, есть особые случаии
https://habr.com/ru/post/271109/
trir вне форума  
 
Непрочитано 08.03.2021, 03:32
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Цитата:
Сообщение от trir Посмотреть сообщение
как мне говорилит умные люди - это не всегда так, есть особые случаии
естественно, если объект скрыто пересоздается - то ему будет присвоен следующий свободный primary key в качестве хэндла.

Цитата:
Сообщение от trir Посмотреть сообщение
https://habr.com/ru/post/271109/
и что делает .Net в теме про VBA-COM-Excel?) Не путайте людей, тем более на те же события через COM не подключиться без серьезных танцев с бубном.
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.03.2021, 13:29
#9
lalych


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


Ребят, оставьте .Net мне для других целей. Для разработки клиентсерверных приложений в связке с SQL сервером И кстати я надеюсь никто не работает с VB.Net, так как язык не развивается , сейчас развивается либо C# на net платформе либо под web ASP.net
Давайте дожмем вставку текстовой переменной "тратата" в одно из полей проекта autocad

----- добавлено через ~19 мин. -----
Итак, я из excel подключаюсь к файлу



Код:
[Выделить все]
...
filePath = "C:\Users\SL\Desktop\autoc\dwg1.dwg"
Dim Acad As New AcadApplication
Set docA = Acad.Documents
docA.Open filePath 
....
lalych вне форума  
 
Непрочитано 08.03.2021, 14:08
#10
trir


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


HandleToObject Method
Gets the object that corresponds to the given handle.

Signature

RetVal = object.HandleToObject(Handle)

Object

Document
The object or objects this method applies to.

Handle

String; input-only
The handle of the object to return.

RetVal

Object
The object that corresponds to the given handle.

Remarks

This method can return only objects in the current document.
trir вне форума  
 
Автор темы   Непрочитано 08.03.2021, 14:37
#11
lalych


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


trir
Спасибо, что у меня будет объектом ,который необходимо вставить в HandleToObject? У меня на чертеже 7 объектов типа Mtext. Как мне выбрать именно 3ий сверху) , а не 4ый к примеру.
lalych вне форума  
 
Непрочитано 08.03.2021, 15:20
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


какой хэндл скормите HandleToObject - тот мультитекст и обновите) Вопросы для программиста с опытом работы 10+ лет, мягко говоря, странные - к этому времени обычно уже умеют искать информацию в инете самостоятельно.
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.03.2021, 15:40
#13
lalych


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


Куском кода бы помогли лучше. Объектная модель и обработка объектов в автокаде весьма отличается от остальных.
dwg1.zip

Вот чертеж. На нем три поля типа Mtext. Как к примеру во второе поле Проверил вставить значение Иванов.
lalych вне форума  
 
Автор темы   Непрочитано 08.03.2021, 17:30
#14
lalych


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


Кодом бы лучше помогли)
lalych вне форума  
 
Непрочитано 08.03.2021, 17:59
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Вариантов куча - напрямую в мультитекст писать, сделать свойства в чертеже и полями ссылки (что у вас в принципе и сделано), подшивки и т.д. Доделывайте свой вариант - почитайте в инете про AcadSummaryInfo и вперед. Хэндлы в данном случае вообще не нужны, как и знать порядок следования мультитекстов на чертеже.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от lalych Посмотреть сообщение
Объектная модель и обработка объектов в автокаде весьма отличается от остальных.
объектная модель каждого приложения отличается от других - было бы очень странно, если они совпадали бы даже у одного разработчика. Как понимаю, книжку из второго поста даже не пробовали открывать)
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.03.2021, 18:31
#16
lalych


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


Открывал, посмотрел свойста объекта Mtext на 553 странице. Не нашел у него атрибутов типа text, либо методов типа setText, либо updateText.
Каждый отдельный объект (будь это поле в приложении excel,access,libreOffice. C# windows forms , JavaFx и прочие программы с GUI имеют либо свое системное имя ,которое можно задавать, либо свой уникальный индекс в коллекции
элементов . ) И при открытии проекта, к уже созданным ранее полям можно обратиться по системному имени/индексу и изменить значение этого поля .
В бейсике к примеру ИмяСлояИлиЛистаИлиФОрмы.имяКонтрола.Text = "Какое то новое значение".
В Java к примеру нужно сначала выбрать этот обьект, при помощи findViewById(имя.объекта) и потом что то с ним делать. (Ну к примеру android java, или javaFx.)
Вложения
Тип файла: zip test.zip (36.6 Кб, 7 просмотров)

Последний раз редактировалось lalych, 08.03.2021 в 19:15.
lalych вне форума  
 
Автор темы   Непрочитано 08.03.2021, 18:37
#17
lalych


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


Я не пишу в AC , мне нужно помочь одному человеку тупо вставить значения в три поля, и после теста и корректной работы VBA забыть об автокаде.
А как писать напрямую в мультитекст из VBA?

----- добавлено через ~35 мин. -----
Думаю что предпочтительней и проще писать напрямую. Только как обратиться напрямую к Mtext конкретному? У него индекс в коллекции есть какой либо?

К примеру что тто типа такого
ThisDrawing.Documents.Collection.Controls("Mtext")(0) = "какой то новый текст"
lalych вне форума  
 
Непрочитано 08.03.2021, 19:27
#18
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,038


Цитата:
Сообщение от lalych Посмотреть сообщение
Открывал, посмотрел свойста объекта Mtext на 553 странице
переверните на 554 страницу Чем TextString не устроил?

Цитата:
Сообщение от lalych Посмотреть сообщение
К примеру что тто типа такого
ThisDrawing.Documents.Collection.Controls("Mtext")(0) = "какой то новый текст"
Если только будете вести какую-то свою коллекцию. Русским языком же было сказано про хендлы, про свойства чертежа. Обновили свойства чертежа и сделали регенерацию, поля сами подхватят значения из пользовательских свойств файла.

p.s. ThisDrawing.Documents - это даже не масло маслянное, Documents является контейнером для документа, а не наоборот.

----- добавлено через ~3 мин. -----
p.s.s. И сначала пробовать подключаться к запущенному акаду, и если неудачно - то тогда запускать новый экземпляр акада. Оперативка не резиновая)
Сергей812 вне форума  
 
Автор темы   Непрочитано 08.03.2021, 21:20
#19
lalych


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


Не, не осилил. Не понял порядка действий. Времени уже не хватит помочь. Спасибо за помощь.
lalych вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменить текст в Mtext чертежа из другого приложения (VBA)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменить стиль MTEXT Redya AutoCAD 31 20.10.2019 10:44
После редактирования mText происходит сдвиг и масштабирование чертежа Vladimir Hotsanovich AutoCAD 3 27.01.2014 13:47
Создание нового слоя и перенос на них с другого чертежа. Arraders AutoCAD 5 13.09.2013 10:59
при открытии чертежа (ACAD 64x 2008) на ACAD 32x 2008rus сбивается текст Р.Д. AutoCAD 5 21.04.2010 23:49
Извлечение информации из Mtext (текст и координаты) в автоматическом режиме Volod'ka AutoCAD 7 30.10.2009 23:33