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

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

Последовательный перенос текста из ячеек Excel в указываемый текст в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 13.10.2014, 18:26 #1
Последовательный перенос текста из ячеек Excel в указываемый текст в AutoCAD
АлександрКиндеров
 
Регистрация: 13.10.2014
Сообщений: 7

Всем салют!

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

Имеется: тысячи строк в экселе со значением отметок для поперечников дороги; КАД файл с поперечниками и подписями значений отметок на "гитаре отметок".

См. КАД и Эксель файлы в приложени.

Все бы ничего если бы таких значений вбивать приходилось бы в исчислении сотни, двух. ... продолжал бы конечно как и ныне делать вручную. Но необходимость вбивать цифры в тупую растет и растет и делать это становится жутко затратно по времени.... а в программировании лиспов и прочего в КАД я не силен.

Благодарен за советы заранее
А.

----- добавлено через ~2 мин. -----
Сорри, Эксель не прикрепляется почемуто... привожу пример исходных данных для копирования ниже:

До края асфальта 5м слева от оси по оси
ПИКЕТ ДИСТАНЦИЯ СЛЕВА ОТ ОСИ Фактический уровень ДИСТАНЦИЯ СЛЕВА ОТ ОСИ Фактический уровень ДИСТАНЦИЯ СЛЕВА ОТ ОСИ Фактический уровень
26+00 -8.37 1550.04 -5 1544.1 0 1547.03
26+20 -8.21 1548.46 -5 1542.67 0 1545.57
26+40 -8.2 1547.03 -5 1541.4 0 1544.1
26+60 -8.04 1545.57 -5 1540.15 0 1542.67

Вложения
Тип файла: dwg
DWG 2007
DWG куда текст из Эксель ячеек должен вставляться.dwg (1.82 Мб, 2500 просмотров)

Просмотров: 6562
 
Непрочитано 13.10.2014, 18:36
#2
Солидворкер
Moderator

Конструктор (машиностроение)
 
Регистрация: 23.10.2006
Россия
Сообщений: 23,283
<phrase 1=


Цитата:
Сообщение от АлександрКиндеров Посмотреть сообщение
Сорри, Эксель не прикрепляется почемуто...
Надо запаковать в архив
Солидворкер вне форума  
 
Непрочитано 14.10.2014, 06:46
#3
trir


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


Civil 3D!!!!!!
trir вне форума  
 
Автор темы   Непрочитано 14.10.2014, 10:33
#4
АлександрКиндеров


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


Civil конечно было бы интересно освоить ... но врядли получится быстрее чем вбивать значения уже полученные в другой программе

Знаю что задача глупая, но не вижу пока другого варианта как найти какоенибудь решение упростить вставку с экселя в КАД
АлександрКиндеров вне форума  
 
Непрочитано 14.10.2014, 11:22
#5
trir


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


Пакетным файлом:
Цитата:
(command "-ТЕКСТ" "В" "СЛ" '(<dist> -20) 2 -90 "<dist>")
(command "-ТЕКСТ" "В" "СЛ" '(<dist> 20) 2 -90 "<otm>")
trir вне форума  
 
Непрочитано 14.10.2014, 11:36
#6
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Очевидно, что задачу можно нааамного больше автоматизировать... но в такой постановке, если вы готовы много кликать мышкой по текстам, то могу предложить вот такой вариант:
1) Создаем связь с данныx c Exel.
2) Вставляем таблицу в автокад.
3) Разрушаем таблицу.
4) Пользуемся например таким копировщиком (VBA) (Работает по принципу, кликнул на первый текст, кликнул на 2й текст):
Код:
[Выделить все]
Sub art_TextToText()
Dim returnObj As AcadObject
Dim basePnt As Variant
Dim tObj As AcadText: Dim mtObj As AcadMText
Dim strText As String
On Error Resume Next
Repeat:
With ThisDrawing.Utility
.GetEntity returnObj, basePnt, "Выберите первый текст:"
If Err <> 0 Then
    Err.Clear
    Exit Sub
Else
    Select Case returnObj.ObjectName
        Case "AcDbText"
            Set tObj = returnObj
            strText = tObj.TextString
        Case "AcDbMText"
            Set mtObj = returnObj
            strText = mtObj.TextString
    End Select
    .GetEntity returnObj, basePnt, "Выберите второй текст:"
    If Err <> 0 Then
        Err.Clear
        Exit Sub
    Else
        Select Case returnObj.ObjectName
        Case "AcDbText"
            Set tObj = returnObj
            tObj.TextString = strText
        Case "AcDbMText"
            Set mtObj = returnObj
            mtObj.TextString = strText
    End Select
    
    End If
End If
End With
GoTo Repeat
End Sub

Автоматизатия на ахти какая, все равно лучше чем от руки вбивать значения...
Но, если объекты текста куда нужно вставлять всегда расположены в одних и тех же местах, то лучше создать блок с атрибутами, и туда уже пакетно вставлять данные, можно и прямяком из Excel. Вообще вариантов куча, все зависит от необходимости и возможных трудозатрат.
art_rrc вне форума  
 
Автор темы   Непрочитано 14.10.2014, 15:10 копировщик (VBA)
#7
АлександрКиндеров


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


большой мерси, попробовал Ваш "копировщик (VBA)" - работает, приколько. Уже упрощает ситуацию.

минус в том что мне придется мотаться между своими поперечниками (чертежиками профилей дороги) и местом где я взорвал табличку... Это решается разбитием окна чертежа на два, но кликаний конечно чуток увеличивается за счет перехода между окнами.

Но это конечно уже намного быстрее чем то как я это делал вручную с клавы. Спасибо!!!

===

Первый вариант про Пакетный Файл не понимаю... Поясните пожта как им пользоваться?
АлександрКиндеров вне форума  
 
Непрочитано 14.10.2014, 15:24
#8
trir


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


1. В Excel'е формулой поставить нужные значения вместо <dist> и <otm>
2. Сохранить в текстовом файле с расширением .scr
3. В АкАд'е выполнить командой ПАКЕТ
trir вне форума  
 
Автор темы   Непрочитано 14.10.2014, 16:06
#9
АлександрКиндеров


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


ПАКЕТ это я так понимаю SCRIPT ? сорри я всю жизнь только на английской версии акада работал (

Пункты 2 и 3 вроде понятны ( третий пункт это запустить скрипт - RUN SCRIPT команда).

но пожалуйста подскажите как будт выглядеть нижеследующее для английского акада: ?

(command "-ТЕКСТ" "В" "СЛ" '(<dist> -20) 2 -90 "<dist>")
(command "-ТЕКСТ" "В" "СЛ" '(<dist> 20) 2 -90 "<otm>")

шаг первый: "В Excel'е формулой поставить нужные значения вместо <dist> и <otm> ". Значения в экселе вписаны цифрами, не совсем понимаю что значит и куда поставить эти значения?
АлександрКиндеров вне форума  
 
Непрочитано 14.10.2014, 16:16
#10
Сергей812


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


"-ТЕКСТ" = -TEXT
а далее смотрите в ком. строке
Сергей812 вне форума  
 
Автор темы   Непрочитано 14.10.2014, 16:50
#11
АлександрКиндеров


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


Ок, с этим вроде понятно "-ТЕКСТ" "В" "СЛ" = "-TEXT" "J" "L" (повидимому речь о Justify to the Left)

но про вторую часть команды пока не понял ... '(<dist> -20) 2 -90 "<dist>"

читаю про написание скриптов, попробую разобраться что куда втыкать
АлександрКиндеров вне форума  
 
Непрочитано 14.10.2014, 18:16
#12
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Развивая тему блока с атрибутами.. О которой я говорил в #6. Можно делать примерно так.. См. вложение.
Вложения
Тип файла: flv art_rrc AutoCAD ExcelToBlock.flv (4.15 Мб, 156 просмотров)
art_rrc вне форума  
 
Автор темы   Непрочитано 16.10.2014, 18:45
#13
АлександрКиндеров


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


art_rrc,

Это очень интересно. Где можно узнать поподробнее? Можно ли вставлять таким образом в простые текстовые строки?
АлександрКиндеров вне форума  
 
Непрочитано 16.10.2014, 19:46
#14
Сергей812


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


По названию панели и комстроке терзают смутные подозрения, что это макросы)
Сергей812 вне форума  
 
Непрочитано 16.10.2014, 21:29
#15
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Цитата:
Сообщение от АлександрКиндеров Посмотреть сообщение
art_rrc,Это очень интересно. Где можно узнать поподробнее? Можно ли вставлять таким образом в простые текстовые строки?
Как сказал Сергей812, это действительно макрос. Я его набросал просто для демонстрации возможностей. И да, конечно в текст тоже можно. НО блок выбираешь 1м кликом, а по текстам опять придется кликать кучу раз. Если вы более подробно опишите (желательно по пунктам) как вы видите в идеале работу, возможно, я смогу подправить код под ваши нужды.
Код:
[Выделить все]
Sub art_ExcelToBlock()
Dim Msg As String
Dim i, j As Integer
Dim a(1 To 4) As String
Dim blObj As AcadBlockReference
On Error Resume Next
Set ExcelApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
    Err.Clear
    On Error GoTo errhandler
    Set ExcelApp = CreateObject("Excel.Application")
    Else
        On Error GoTo errhandler
    End If
'dirnam = "D:/"
dirnam = "D:\All_For_Acad_2015\art_rrc\"
'fnam = "a.xls"
fnam = "Data.xlsx"
shtnam = "Лист1"
ExcelApp.DisplayAlerts = False
ExcelApp.Workbooks.Open dirnam & fnam
For Each wrksht In ExcelApp.Worksheets
If wrksht.Name = shtnam Then
With ExcelApp.ActiveWorkbook.Sheets.Application
i = ThisDrawing.Utility.GetInteger(vbCrLf + "Введите номер строки: ")
For j = 1 To 4
    a(j) = .cells(i, j).Text
Next j
End With
ThisDrawing.Utility.GetEntity blObj, basePnt, "Выберите объект"
If Err <> 0 Then GoTo DavayDoSvidaniya:
For j = 1 To 4
    Call SetAttr(blObj, CStr(j), a(j))
Next j
'blObj = ThisDrawing.Utility.GetEntity(, basePnt, "Выделите объект ")
'MsgBox (a1 & a2 & a3 & a4)
End If
Next
ExcelApp.DisplayAlerts = True
ExcelApp.Workbooks(fnam).Close
Set ExcelApp = Nothing
Exit Sub
errhandler:
MsgBox ("Программа будет закрыта из-за возникновения ошибки" & _
vbCr & Err.Number & " " & Err.Description)
DavayDoSvidaniya:
ExcelApp.DisplayAlerts = True
Set ExcelApp = Nothing
End Sub

PS. Я записывал информацию в ексель много раз, а вот чтоб прочитать из него впервые и буду очень рад, если кто-то посмотрит код и покритикует его .
art_rrc вне форума  
 
Автор темы   Непрочитано 18.10.2014, 09:25
#16
АлександрКиндеров


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


Салют! спасибо за помощь )

С кодом предоставленным Вами ошибка возникает на строке

Call SetAttr(blObj, CStr(j), a(j))

видимо надо чтото подправить или я делаю не в той последовательности...

Моя задача проста:

1. имею табличку с отметками в Экселе (см в приложении)
2. открываю АКАД и в однострочный текст вставляю эти значения последовательно от пикета к пикету. (АКАД файл также в приложенном архиве).


На данный момент я это делаю кодом который предоставил art_rrc по принципу, кликнул на первый текст, кликнул на 2й текст из таблицы которую предварительно затакиваю в акад и там взрываю до однострочного текста.

Ваш вариант выглядит интересно в плане того, что если код самостоятельно будет перебирать строки\ячейки из моего экселя и лишь давать мне кликать по тексту в акаде от пикета к пикету (переодически сообщая "следующий пикет" в то время как переходит на новую строку в экселе). Тут я гораздо больше времени сохраню только на кликании по исходному тексту, так как буду делать это только в начале.

к сожалени, пока что, в написании кодов я полный пень
Вложения
Тип файла: rar Из экселя в КАД по ячейкам.rar (1.59 Мб, 64 просмотров)
АлександрКиндеров вне форума  
 
Непрочитано 18.10.2014, 10:29
#17
Сергей812


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


Цитата:
Сообщение от АлександрКиндеров Посмотреть сообщение
ошибка возникает на строке

Call SetAttr(blObj, CStr(j), a(j))
1. Потому что метод SetAttr не определен. В коде от art_rrc его не вижу. Да и не вижу, где инициализируется массив CStr.
2. Совет: все методы получения данных от пользователя с экрана типа GetEntity оборачивайте в проверку On Error Goto. Когда в свое время начинал писать на VBA - просто делал отдельную функцию ввода типа:
Function GetEntityExt(ByVal aPrompt As String) As Entity
Dim basePnt as Point3d
On error goto ErrGet
ThisDrawing.Utility.GetEntity GetEntityExt, basePnt, aPrompt
Exit Function
ErrGet:
GetEntityExt = Null
End Function

Код писал на коленке, просто для иллюстрации. Доведете до ума сами. Чтобы если куда то не туда ткнул: программа спросила о том, хотите ли завершить работу и если нет - снова запросила бы ввод. Программа должна быть дружественная к пользователю, а не вылетать при первом неправильном вводе.

2. Совет: если файл данных экселя имеет фиксированный формат, а количество строк не запредельно - имеет смысл развязывать операции чтения данных из экселя и обработку блоков на чертежах, имхо. Сделать динамический массив записей (структур Type), туда отдельной функцией загонять данные из экселя. Потом эксель закрывается и если все данные корректны - начинать процесс выбора блоков. Тогда выбор нужного "стартового" пикета можно делать в визуальной форме в списке.

p.s. Не бойтесь экспериментировать. VBA очень дружественный к пользователю. И можно использовать множество примеров кода для Office для решения сопутствующих задач.

Последний раз редактировалось Сергей812, 18.10.2014 в 10:59.
Сергей812 вне форума  
 
Непрочитано 18.10.2014, 19:56
#18
Кулик Алексей aka kpblc
Moderator

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


Cstr - это не массив, а преобразование в строку
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.10.2014, 20:23
#19
Сергей812


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


Проглядел, спасибо) Но в любом случае реализации метода SetAttr нет. Да и не совпадает он с требуемым - там подразумевается инициализация атрибутов блока, а нужно просто текст, судя по ветке. Еще что заметил в коде поста №15 - что нет проверки на тип выбранного примитива (если, конечно, эта проверка не внутри SetAttr). А проверка неправильного ввода есть вроде, но тихая - ничего не сообщая, при первой же ошибке отключается от экселя.
Сергей812 вне форума  
 
Непрочитано 18.10.2014, 20:48
#20
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 375


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Проглядел, спасибо) Но в любом случае реализации метода SetAttr нет. Да и не совпадает он с требуемым - там подразумевается инициализация атрибутов блока, а нужно просто текст, судя по ветке. Еще что заметил в коде поста №15 - что нет проверки на тип выбранного примитива (если, конечно, эта проверка не внутри SetAttr). А проверка неправильного ввода есть вроде, но тихая - ничего не сообщая, при первой же ошибке отключается от экселя.
Да это всего лишь процедура, для записи в атрибут блока. Остался в другом модуле, поэтому и забыл про него, тк уже очень привык к ней и для меня она почти стандартная)
Вот это нужно добавить в код:
Код:
[Выделить все]
Public Sub SetAttr(DynBlockObj As AcadBlockReference, AttrName As String, AttrTextStr)
attr = DynBlockObj.GetAttributes
For i = 0 To UBound(attr)
    If attr(i).TagString = AttrName Then
    attr(i).TextString = AttrTextStr
    End If
Next
End Sub

ps. Атрибуты в блоке называются "1","2","3","4".

Добавлено:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Проглядел, спасибо) Но в любом случае реализации метода SetAttr нет. Да и не совпадает он с требуемым - там подразумевается инициализация атрибутов блока, а нужно просто текст, судя по ветке. Еще что заметил в коде поста №15 - что нет проверки на тип выбранного примитива (если, конечно, эта проверка не внутри SetAttr). А проверка неправильного ввода есть вроде, но тихая - ничего не сообщая, при первой же ошибке отключается от экселя.
Код никак не рабочий, а демонстрационный (написан минут за 10-15). Для того чтоб, продемонстрировать "Как можно". А все проверки - это навороты для более удобной !работы!. Тексты, проверки все это конечно можно, но уже в понедельник...)

Последний раз редактировалось art_rrc, 18.10.2014 в 20:55.
art_rrc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Последовательный перенос текста из ячеек Excel в указываемый текст в AutoCAD

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59
Однострочный текст в AutoCAD 2007 Угол поворота текста Татьянка Смешная AutoCAD 6 13.02.2009 15:24
Координаты текста из AutoCAD в Excel Rus2007 AutoCAD 11 23.10.2007 16:36
Перебор ячеек в Excel из VBA AutoCAD SVitaliy Программирование 6 10.10.2007 23:45