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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли с помощью VBA (или Lisp) редактировать spdsNotePosition (выноску СПДС)?

Можно ли с помощью VBA (или Lisp) редактировать spdsNotePosition (выноску СПДС)?

Ответ
Поиск в этой теме
Непрочитано 16.07.2010, 08:57 #1
Можно ли с помощью VBA (или Lisp) редактировать spdsNotePosition (выноску СПДС)?
AlexV
 
Инженер
 
С-Пб
Регистрация: 02.10.2008
Сообщений: 3,685

То бишь, имеем мы к примеру obj As AcadEntity, туда тем или иным способом запихиваем spdsNotePosition (хотя бы через
Код:
[Выделить все]
ThisDrawing.Utility.GetEntity obj, varPoint, "выберите выноску"
)
Возможно ли отредактировать средствами VBA значения текстовых полей и положения выноски? В references нашел и подключил библиотеку MechaniCS COM2.0 type library, и фантазии моей пока хватает только на то, что объявить переменную
Код:
[Выделить все]
Dim spdsnote As McComEntityNote
и попытаться передать в нее obj :
Код:
[Выделить все]
Set spdsnote = obj
(Способ, возможно, тупой, но бывало у меня получались аналогичные манипуляции с объектами ASD, после чего соответственно появлялся доступ к свойствам этих объектов). Но в данном случае не получается, "несовпадение типов" (Пробовал и другие классы, в именах которых есть "note", - McComEntityNotePosition и т.д.)
(entget (car (entsel))) при выборе выноски показывает:
Код:
[Выделить все]
Выберите объект: ((-1 . <Имя объекта: 7ef03ac0>) (0 . "spdsNotePosition") (330 
. <Имя объекта: 7ef01cf8>) (5 . "2C8") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (370 . 25) (100 . "mcsDbObject") (100 . 
"mcsDbObjectNotePosition") (90 . 1) (301 . "Name") (300 . "111") (301 . "Info") 
(300 . "Позиционная выноска\r\n111\r\n222") (301 . "Scale") (40 . 1.0) (301 . 
"CutAcElements") (290 . 1) (301 . "WipeOut") (290 . 0) (301 . "Text style") 
(300 . "GOST 2.304") (301 . "String1") (300 . "111") (301 . "String2") (300 . 
"222") (301 . "TextAlign") (90 . 1) (301 . "RackDir") (40 . 180.0) (301 . 
"TextSize") (40 . 2.5) (301 . "SmallTextSize") (40 . 2.5) (301 . "AngleStep") 
(40 . 0.0))
, т.е. можно разглядеть, какие dxf коды что содержат, и смутно я представляю, что на лиспе их должно быть не сложно изменить.. Но лисп я не знаю, поэтому хотелось бы как-то с помощью VBA..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
Просмотров: 5504
 
Непрочитано 16.07.2010, 09:18
#2
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?p=375608&#post375608 видел? Оно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2010, 09:20
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


А что выдаст такой код?:
Код:
[Выделить все]
(vl-load-com)(vlax-dump-Object (vlax-ename->vla-object (car (entsel "\nSelect spdsNotePosition:"))) T)
Do$ вне форума  
 
Автор темы   Непрочитано 16.07.2010, 09:37
#4
AlexV

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
О, спасибо! Однако, поиск никто не отменял..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 16.07.2010, 10:08
#5
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


лиспом тоже можно. Перебираешь аккуратно все пары, а потом entmod
фрагмент:

(repeat (length sObj)
(if (= (cdr (nth i sObj)) "Text")
(progn
(setq sObj (subst (cons 300 pasteStr) (nth (1+ i) sObj) sObj))
(entmod sObj)
) ;_ progn
) ;_ if
(setq i (1+ i))
)
crosandr вне форума  
 
Непрочитано 16.07.2010, 10:12
#6
Кулик Алексей aka kpblc
Moderator

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


AlexV, я просто помнил, что Яков выкладывал какие-то решения для СПДС на VBA. Поэтому целенаправленно и искал (вопрос все же редкий достаточно, обычный поиск тут не помощник).
crosandr, выноски СПДС - отдельный класс примитивов, и с entmod там надо очень аккуратно работать.
Offtop: P.S. Вот если бы Яков и тут отписался - ух, было бы классно! Можно было бы и насчет .net поспрошать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2010, 10:33
#7
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


на 6м spds работает стабильно, кроме осей, а на 4м и оси менялись без проблем
crosandr вне форума  
 
Непрочитано 16.07.2010, 10:40
#8
Кулик Алексей aka kpblc
Moderator

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


crosandr, прекрасно. В списке из #1 замени строку 111 на 333 и убери строку 222. Задачка не настолько сложная, как ты говоришь...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.07.2010, 10:56
#9
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


поправлюсь, в спдс объектах я заменял только текстовое содержание.
crosandr вне форума  
 
Автор темы   Непрочитано 16.07.2010, 11:45
#10
AlexV

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


На самом деле, локальная у нас такая задачка.. Из модели в ASD steel получаем чертежи стальных узлов.. Оформлять чертежи только средствами ASD пока не получается, поэтому экспортируем в автокад, и на выходе получаем плоские чертежи, которые надо дорабатывать ручками. Вот и хотелось бы программно повставлять выноски СПДС вместо "экспортнутых" из ASD (они экспортируются, разбиваясь на примитивы отрезок-полилиния-мтекст). Снять информацию с "убитых" выносок ASD я смогу, выноску СПДС тупо загоню в блок, который и буду программно вставлять "в нужные места", после чего эксплодить. Соответственно надо выноске присвоить нужные текстовые значения, ну и желательно позиционировать ее правильно...
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 16.07.2010, 12:03
#11
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


а старые ссылки как уберешь?
присвоить значение можно, а вот позиционирование это более интеллектуальное дело
Offtop: Вообще, доработка чертежей ручками больная тема
crosandr вне форума  
 
Автор темы   Непрочитано 16.07.2010, 13:19
#12
AlexV

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


Цитата:
Сообщение от crosandr Посмотреть сообщение
а старые ссылки как уберешь?
Ну, ломать - не строить.. Проблемы с их убийством никакой..
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 20.07.2010, 09:45
#13
AlexV

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


Спасибо добрым людям из сисофта , подсказали, как на VBA выноску СПДС создать..
Код:
[Выделить все]
   '*************
On Error Resume Next 
        Dim server
        Set server = CreateObject("McCOM.McCOMServer")
            If Err <> 0 Then
              MsgBox Err.Number & Err.Description & vbCrLf 
              End
            End If
        server.StartCommand     
        Dim mcobject
        Set mcobject = server.CreateObject("McCOM.McEntityNote")
        mcobject.Origin = Array(Point(0), Point(1))
        mcobject.Dir = 0
        mcobject.AddSegment Array(Point1(0), Point1(1)), Array(Point2(0), Point2(1)), -1
        mcobject.Arrow = 1
        Dim units(1, 1)
        units(0, 0) = "ёклмн"
        units(1, 0) = "нмлкйо"
        units(0, 1) = 0
        units(1, 1) = 0
        mcobject.units = units
        server.AddObjectToDoc (mcobject)
        mcobject.Update
        server.EndCommand
'********
Все работает на 2009, 2010, 2011 автокадах (при подключении соответствующих бибилиотек) и на висте, и на "7". Но - только если винда 32 битная. Почему-то на 64-битной Set server = CreateObject("McCOM.McCOMServer") выдает ошибку. Да и вообще VBA на 64-битной системе почему-то оставляет ощущение глючности.. Формы как-то виснут, особенно немодальные, - все элементы неактивны, включая комбобоксы и баттоны, даже закрыть форму не получается через стандартный ее "х"
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 20.07.2010 в 09:57.
AlexV вне форума  
 
Автор темы   Непрочитано 09.09.2010, 16:50
#14
AlexV

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




Возникает вопрос по предыдущему коду из #13.. К добрым людям ..
Выноски благополучно создаются, но.. Если они ориентированы полкой вправо, все окей, если ж влево, то получается небольшой "косяк". Почему-то грипсы, за которые перемещается и зеркалится полка, находятся не с той стороны.. То бишь сегмент, который добавляется в "mcobject.AddSegment", хотелось бы привязывать к "mcobject.Origin", а не к противоположной стороне полки. На рисунке это видно (ну или в dwg приложенном"). Пытался по-разному задавать все точки (Origin, начало-конец добавляемого сегмента), но при всех вариантах не то получается..

p.s. корячился, корячился.. только сообщение создал, разобрался. mcobject.Dir = 3.1415269.... для выносок с полкой ориентацией влево..
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 658
Размер:	9.0 Кб
ID:	45004  
Вложения
Тип файла: dwg
DWG 2007
чертеж11.dwg (99.7 Кб, 1096 просмотров)
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!

Последний раз редактировалось AlexV, 09.09.2010 в 17:14.
AlexV вне форума  
 
Непрочитано 21.10.2010, 00:46
#15
puma


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


Путем перебора нашел, что масштаб спдс хранится в dxf-коде (301 . Scale) (40 . МАСШТАБ_ПЕРЕМЕННАЯ) - возможно ли как-то изменить эту переменную? (ps извиняюсь за терминологию)

Последний раз редактировалось puma, 21.10.2010 в 00:52.
puma вне форума  
 
Непрочитано 07.11.2017, 15:55
#16
100рож

Инженер ПГС
 
Регистрация: 18.01.2013
Самара
Сообщений: 106


Добрый день.
Задача такая. В одном SelectionSet'е присутствуют однострочные тексты и выноски СПДС. Как на VBA выполнить поиск и замену в этих объектах?

Код:
[Выделить все]
Option Explicit


Public Sub ReNumber(Pref As String, StartPos As Integer, Suf As String)
    Dim spdsApplication As McCOM2.Server
    'Получаем COM-сервер СПДС
    Set spdsApplication = CreateObject("McCOM2.Server")
    Dim Pos As Integer          'Текущая позиция
    Dim PosCount As Integer     'Количество позиций
    Dim Mark As String          'Марка = Префикс+текущая позиция
    Dim ASS As AcadSelectionSet 'Набор элементов
    Dim i As Integer, j As Integer
    i = 0
    j = 0
    'Очистка набора
    If ThisDrawing.SelectionSets.Count <> 0 Then
        'MsgBox ("Болт")
        With ThisDrawing.SelectionSets
        While .Count > 0
            .Item(0).Delete
        Wend
        End With
    End If
    
    Set ASS = ThisDrawing.SelectionSets.Add("Marks")
    ASS.SelectOnScreen
    
    If ASS.Count = 0 Then GoTo Fin
    
    PosCount = ASS.Count
    
    Dim oItem As AcadObject
    Dim acText As AcadText
    Dim acBlock As AcadBlockReference
    Dim acAttrs As Variant
    Dim acBlockProps As Variant

    
    For Each oItem In ASS
        If TypeOf oItem Is AcadText Then
            Set acText = oItem
            Pos = StartPos + i
            Mark = Trim(Pref) + Trim(Str(Pos)) + Trim(Suf)
            acText.TextString = Mark
            i = i + 1
            acText.Update
        ElseIf oItem.ObjectName = "mcsDbObjectNotePosition" Then
        'Вот здесь нужно взять и поменять значение первой строки выноски на Mark
        End If
       
    Next
    ThisDrawing.Regen acActiveViewport
Fin:
    ThisDrawing.SelectionSets("Marks").Delete
End Sub
100рож вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли с помощью VBA (или Lisp) редактировать spdsNotePosition (выноску СПДС)?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Lisp или VBA? mr_ivan LISP 1 13.05.2008 12:20
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46