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

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

Перенос числовых данных из чертежа в программу

Ответ
Поиск в этой теме
Непрочитано 31.10.2010, 14:36 #1
Перенос числовых данных из чертежа в программу
Julius
 
Регистрация: 30.10.2010
Сообщений: 5

Всем доброго времени суток.
Пишу макрос для автокада. Суть его в том, что пользователь выбирает щелчком мыши некоторые текстовые блоки (text и mtext) в которых содержаться числа. Затем, по окончанию выбора программа выдает сумму всех чисел в выбранных текстовых блоках.
Проблема в том, что я не знаю как присвоить переменной в программе значения числа в текстовом блоке (например, я выбираю на чертеже текстовый блок, в котором написано число 5 и некой переменной в программе присваивается значение 5).
Помогите, пожалуйста.
Заранее спасибо.
Просмотров: 9547
 
Непрочитано 31.10.2010, 15:05
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Возможно вам поможет INCDEC
gomer вне форума  
 
Непрочитано 31.10.2010, 15:20
#3
Кулик Алексей aka kpblc
Moderator

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


http://www.google.ru/cse?cx=partner-...7%23post647137
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.10.2010, 20:26
#4
AlexV

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


Julius, ну дак код-то уже есть какой-то или ты с нуля его хочешь получить? "макрос для автокада", - на VBA значит пишешь? Выбираешь программно тексты и мтексты, затем перебираешь полученный набор, проверяя свойство textstring.. Алгоритм получения суммы зависит от твоих задач: - что за тексты надо "собирать", - содержащие только числа, или все ( только "1", "2", "33", либо еще и "12АБВ", "12АБВ123" и т.д.). Для mtext надо наверное еще учитывать возможность наличич форматирования внутри него (т.е в нем может быть текст из цифр "111", но подчеркнутых-надчеркнутых-с другим шрифтом, цветом и т.д., тогда textstring может содержать к примеру значение "{\fCurlz MT|b0|i0|c0|p82;\C1;1111}", и искомые "111" надо еще отсюда выдернуть..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 31.10.2010, 21:33
#5
Julius


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


Кулик Алексей, спасибо за полезную ссылку. Нашел программу, почти ту, что мне нужно. Поменял одну строку, вот что получилось:

Sub SummaMText()

Dim SelSetColl As AcadSelectionSets
Dim CirSet As AcadSelectionSet
Dim item As AcadMText
Dim Summa As Double

Set SelSetColl = ActiveDocument.SelectionSets
Set CirSet = SelSetColl.Add("Mt")
CirSet.SelectOnScreen


For Each item In CirSet
Summa = Summa + CDbl(item.TextString)
Next item

CirSet.Delete
Set CirSet = Nothing
Set SelSetColl = Nothing

MsgBox Summa

End Sub


Но столкнулся с такой проблемой: когда я вставляю код в редакторе VBA в окно "Thisdrawing", то все работает отлично. А когда я создал форму и повесил этот же код на нажатие кнопки, то автокад стал выдавать ошибку "Главное окно AutoCAD невидимо" и и показывает, что ошибка в строке

CirSet.SelectOnScreen

Кто знает в чем причина? Подскажите.

Последний раз редактировалось Julius, 31.10.2010 в 21:55.
Julius вне форума  
 
Непрочитано 31.10.2010, 21:52
#6
AlexV

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


Цитата:
Сообщение от Julius Посмотреть сообщение
Код я пишу с нуля на VBA. Что касается текстов, то тут все довольно просто - это будут числа типа "100", "2300" и т.д.
Ну дак выложи, чего написал-то уже.. В чем затрудненья?
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 31.10.2010, 22:27
#7
Julius


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


Цитата:
Сообщение от AlexV Посмотреть сообщение
Ну дак выложи, чего написал-то уже.. В чем затрудненья?
Вот выложил. Смотрите предыдущее сообщение
Julius вне форума  
 
Непрочитано 31.10.2010, 22:42
#8
AlexV

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


Цитата:
Сообщение от Julius Посмотреть сообщение
Но столкнулся с такой проблемой: когда я вставляю код в редакторе VBA в окно "Thisdrawing", то все работает отлично. А когда я создал форму и повесил этот же код на нажатие кнопки, то автокад стал выдавать ошибку "Главное окно AutoCAD невидимо" и и показывает, что ошибка в строке
CirSet.SelectOnScreen
Кто знает в чем причина? Подскажите.
Потому что форма по умолчанию модальная. Соответственно, когда она запущена, главное окно автокада и "не видимо", поэтому при попытке выбора объектов выдается ошибка. Надо либо сделать форму немодальной (свойство ShowModal в окне свойств формы = false), либо в начале процедуры по нажатию кнопки скрывать форму UserForm1.Hide; по окончании процедуры снова выводить на экран UserForm1.Show. В первом случае (если форма будет немодальной) невозможно будет вводить текст с клавиатуры в textbox-ы и другие подобные контролы формы.
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 31.10.2010, 22:50
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Если еще и очистить набор, все получится
gomer вне форума  
 
Непрочитано 31.10.2010, 23:05
#10
AlexV

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


Ну и еще, если исходить из кода в #5, еще несколько замечаний.. SelectOnScreen производится без фильтра, а переменная item объявляется As AcadMText. Если пользователь выберет любой другой примитив (даже AcadText, который вроде тоже должен учитываться), то в цикле выскочит ошибка. Ну, это конечно легко лечится вставкой в начале кода строки "On Error Resume Next", но грамотней использовать фильтры.. Чего-то типа такого:

Код:
[Выделить все]
'....
Dim intType(3) As Integer
Dim varData(3) As Variant
intType(0) = -4
varData(0) = "<OR"
intType(1) = 0
varData(1) = "MTEXT"
intType(2) = 0
varData(2) = "TEXT"
intType(3) = -4
varData(3) = "OR>"
'....
CirSet.SelectOnScreen intType, varData
А еще, строка
Set CirSet = SelSetColl.Add("Mt")
Если в файле вдруг уже есть набор с именем "Mt", тоже выскочит ошибка.. Можно перед этой строкой проверить:

Код:
[Выделить все]
For Each CirSet In ThisDrawing.SelectionSets
 If CirSet.name =  "Mt" Then
    CirSet.Delete
    Exit For
 End If
Next
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 01.11.2010, 23:19
#11
Julius


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


Учел Ваши замечания. Теперь код работает в рамках формы тоже. Однако работает только с Mtext. Когда появляется однострочный текст, то выдает ошибку в строке "For Each item In CirSet"

Код:
[Выделить все]
Private Sub CommandButton1_Click()

Dim SelSetColl As AcadSelectionSets
Dim CirSet As AcadSelectionSet
Dim item As AcadMText
Dim Summa As Double
Dim intType(3) As Integer
Dim varData(3) As Variant

intType(0) = -4
varData(0) = "<OR"
intType(1) = 0
varData(1) = "MTEXT"
intType(2) = 0
varData(2) = "TEXT"
intType(3) = -4
varData(3) = "OR>"

For Each CirSet In ThisDrawing.SelectionSets
 If CirSet.Name = "Mt" Then
    CirSet.Delete
    Exit For
 End If
Next

Set SelSetColl = ActiveDocument.SelectionSets
Set CirSet = SelSetColl.Add("Mt")
CirSet.SelectOnScreen intType, varData


For Each item In CirSet
Summa = Summa + CDbl(item.TextString)
Next item

CirSet.Delete
Set CirSet = Nothing
Set SelSetColl = Nothing

MsgBox Summa

End Sub
Julius вне форума  
 
Непрочитано 01.11.2010, 23:39
#12
Кулик Алексей aka kpblc
Moderator

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


Почему item объявлен как AcadMText, а не как AcadEntity?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.11.2010, 00:14
#13
Julius


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Почему item объявлен как AcadMText, а не как AcadEntity?
Точно! Проглядел.
Теперь все работает. Спасибо.
Julius вне форума  
 
Непрочитано 25.04.2015, 17:16
#14
scad2015


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


Подскажите, а если складывать десятичные числа с дробной точкой вылетает ошибка "Type mismatch", что делать?
-------------------------------------------------------------------

Решил так, заменил строчку (проблема была с десятичной точкой):

Summa = Summa + Val(item.TextString)

Последний раз редактировалось scad2015, 25.04.2015 в 17:27.
scad2015 вне форума  
 
Непрочитано 25.04.2015, 17:33
#15
Кулик Алексей aka kpblc
Moderator

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


scad2015, ты не ошибся темой или разделом? Если нет, то на какой вопрос отвечал? И почему в таком случае не использовал "Цитировать" или "Цитировать выделенное"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.04.2015, 19:35
#16
scad2015


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


Offtop: Я все понял, о чем ты. Я имел ввиду изначально, что эта программа не работает корректно. (может потому что у меня х64)
Я не с потолка вопрос задал.



Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
scad2015, ты не ошибся темой или разделом? Если нет, то на какой вопрос отвечал? И почему в таком случае не использовал "Цитировать" или "Цитировать выделенное"?
Offtop: Теперь использую цитирование

Я решил доработать этот пример, умножить несколько чисел и вставить в другой текст, и сделать все это в цикле , поэтому решил писать сюда. Может доработанный код многим пригодится.

Создать новую тему?
----------------------------

1) Проблема не решилась, при использовании Val. Теперь при перемножении чисел с разделителем дробной части запятой, отбрасывается дробная часть.
Может в VBA есть что-то типа Parse?

2) Как реализовать не бесконечный цикл Do Loop , пробовал отловить завершение через GetInput, но ничего не получилось, почитал по форумам, но ничего толкового не нашел.

Код кривой, но выкладываю как есть, надеюсь на помощь.


Код:
[Выделить все]
Sub Umnogenie()

'On Error Resume Next

Dim SelSetColl As AcadSelectionSets
Dim CirSet As AcadSelectionSet
Dim item As AcadEntity
Dim Summa As Double
Dim intType(3) As Integer
Dim varData(3) As Variant

intType(0) = -4
varData(0) = "<OR"
intType(1) = 0
varData(1) = "MTEXT"
intType(2) = 0
varData(2) = "TEXT"
intType(3) = -4
varData(3) = "OR>"

Do

For Each CirSet In ThisDrawing.SelectionSets
 If CirSet.Name = "Mt" Then
    CirSet.Delete
    Exit For
 End If
Next

Set SelSetColl = ActiveDocument.SelectionSets
Set CirSet = SelSetColl.Add("Mt")
CirSet.SelectOnScreen intType, varData


For Each item In CirSet


If Summa = 0 Then
Summa = 1
End If

Summa = Summa * Val(item.TextString)

Next item

CirSet.Delete
Set CirSet = Nothing
Set SelSetColl = Nothing

'-----------Вставка текста ---------------------
ThisDrawing.Utility.Prompt "Выберите текст для вставки:"

Set SelSetColl = ActiveDocument.SelectionSets
Set CirSet = SelSetColl.Add("Mt")
CirSet.SelectOnScreen intType, varData


For Each item In CirSet
item.TextString = Summa
Next item


'-----------------------------------------------------
ThisDrawing.Utility.Prompt Summa

Summa = 0

Loop 'While Err.Number <> 0

End Sub

Последний раз редактировалось scad2015, 25.04.2015 в 20:43.
scad2015 вне форума  
 
Непрочитано 25.04.2015, 21:59
#17
Кулик Алексей aka kpblc
Moderator

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


Используй Replace, в чем проблема-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.04.2015, 18:44
#18
scad2015


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


Кулик Алексей aka kpblc,
Ничего по Replace не нашел смотрел справке по объектной модели, в справки по VB смотрел мельком.

Подскажи, пожалуйста примером кода.

Offtop: Я VB6 уже давно не пользовался, подзабыл уже
scad2015 вне форума  
 
Непрочитано 27.04.2015, 20:01
1 | #19
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от scad2015 Посмотреть сообщение
Ничего по Replace не нашел смотрел справке по объектной модели,
Replace - стандартная функция VBA, ищи в справке по VBA ее
gomer вне форума  
 
Непрочитано 29.04.2015, 17:43
#20
scad2015


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


gomer, спасибо, замотался нет времени сесть разобраться. Но do loop плохой вариант, нашел несколько вариантом кода, но все через костыли какие-то.

Не понимаю, почему так сделано , что цикл вешает автокад....
scad2015 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Перенос числовых данных из чертежа в программу

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Команда для экспорта ряда числовых значений из чертежа в Excel *AllA* AutoCAD 1 20.09.2010 10:22
Перенос данных из таблицы Автокада в Excel - дубль2 Таня. AutoCAD 1 02.03.2009 16:08
Создание базы данных атрибутов текста чертежа в VBA -still alive- Программирование 4 26.08.2008 15:10
Параметрическое черчение в AutolLisp с использованием базы данных чертежа Danger_pgs LISP 31 02.04.2008 08:38