Перейти к содержанию

Получение листа из коллекции по имени крушит Нанокад (VBA) (решено)


Рекомендуемые сообщения

Собственно код ниже.

Не получается получить элемент коллекции Layouts (Листов) по имени элемента. попытка приводит к зависанию и вылету Нано 10.1

Что интересно аналогичный код но с Layers (Слоями) работает.

Посмотрите, кто понимает.. я недогоняю или ушу ActiveX Нано недостаточно хорош

Sub Test()
Set objApp = GetObject(, "NanoCAD.Application")
Set ThisDraw = objApp.ActiveDocument

Set Layouts = ThisDraw.Layouts
ReDim arOld(Layouts.Count - 2, 1)
For Each Layout In Layouts
	strTmpName = Layout.Name
	If strTmpName = "Model" Then GoTo SKIP ' Skip modelspace
	arOld(n, 0) = strTmpName
	strTmpOrder = Layout.taborder
	arOld(n, 1) = strTmpOrder
	n = n + 1
SKIP:
Next
Stop
sLname = arOld(1, 0)
	Set tempLayout = Layouts(sLname) 'тут зависание и вылет нано
End Sub

Изменено пользователем doctorraz
Ссылка на сообщение
Поделиться на другие сайты

я видел эту тему, проходом по коллекции без проблем, но если нужно сделать еще и сортировку листов....

АК может так

Set tempLayout = Layouts("A4")

и нана может так со слоями, а с листами затык (((

на АК реализовал сортировку переименование листов и слоев... ткнулся на нане повторить, вигвам...

такое впечатление, что разработчики прекратили развитие ActiveX(((

Ссылка на сообщение
Поделиться на другие сайты

Без проверки....

Dim Layouts

Dim Layout

ThisDrawing.ActiveLayout = ThisDrawing.Layouts.Item("Initializacia")

ThisDrawing.Layouts.Item(LayoutName).Name = NewLayoutName

Set ActivniVkladka = ThisDrawing.Layouts(CStr("Model"))

Ссылка на сообщение
Поделиться на другие сайты

точно!!!

Set tempLayout = Layouts.Item(CStr(sLname))

так работает!!!

-------------

ну и сразу новая трабла...

после переименования или сортировки Нано не применяет изменения на чертеже пока не сменишь пространство...

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

типа так

   oldName = ThisDraw.ActiveLayout.Name
   If oldName <> "Model" Then
    ThisDraw.ActiveLayout = Layouts.Item("Model")
   Else
    ThisDraw.ActiveLayout = Layouts.Item(CStr(arrNew(0, 0)))
   End If
   ThisDraw.ActiveLayout = Layouts.Item(CStr(oldName))

коряво млин..((( :(

но возможно есть способ поизящнее..???

Ссылка на сообщение
Поделиться на другие сайты

спасибо.

проблема была в том, что пока не ткнешь вкладку листа или модели (после сортировки или переименования листов) нана не менял имена и порядок.

не очень изящно, но победил)))

Ссылка на сообщение
Поделиться на другие сайты

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

пока сделал как в #5 (мне стыдно, но умнее ниче не придумал, в АК работало без этих танцев)

ЗЫ неспроста в нане не реализовано прямое редактирование названий листов (только через ком строку))) (ядро само по себе у GUI своя жизнь)

Ссылка на сообщение
Поделиться на другие сайты

а если паузу поставить в коде перед регеном в секунду например

Ссылка на сообщение
Поделиться на другие сайты

а если паузу поставить в коде перед регеном в секунду например

даже руками реген не влияет, он жэж обновляет поле чертежа, а не элементы интерфейса (имена вкладок листов)

Ссылка на сообщение
Поделиться на другие сайты

Разница в том, что в АК я сразу вижу результат выполнения

ThisDrawing.Layout.Name = "ИмяЛиста"

а в нане нужны доп движения в виде переключения вкладок листов или модели

Ссылка на сообщение
Поделиться на другие сайты

це дефект

просить боязно, этот баг я знаю, как обойти... каким багом заменят при починке неизвестно :rolleyes:

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
  • Похожий контент

    • От Андрей Х
      Учусь по замечательной статье  Дмитрия Руденко habr.com/ru/post/238867 про Nanocad и VBA работать с Нанокадом.
       
      Столкнулся с такой проблемой.
      Отлично работает имитация ввода простых команд в командную строку, например
      ThisDrawing.SendCommand «CIRCLE» & vbCr & «100,100,0» & vbCr & «1000» & vbCr

      Но как работать с командами, после которых открываются модальные окна?

      Конкретно, мне нужно выполнить команду «pdfimport». Но после этой команды открывается окно открытия файла (а после него — окно выбора параметров импорта), то есть вариант типа ThisDrawing.SendCommand «pdfimport» & vbCr & file_name & vbCr &…
      не работает.
       
      Возможно, можно как-то выполнить эту процедуру и без командной строки, но такого я тоже не знаю.
       
      Общая задача - импортировать чертежи из множества pdf-файлов. Поэтому этот алгоритм должен выполнятся сам, автоматически, без открытия каких-либо окон.
    • От Lion2032
      Есть XML одно из вертикалок Нано.
      Нужно вытащить данные в Эксель.
       
      Дынный код

      point.ChildNodes(1).ChildNodes(1).ChildNodes(1).ChildNodes(1).ChildNodes(1).ChildNodes(3).Text
      вытаскивает следующую строку
       
      Pр (Pном), кВт 11,5
       
      А мне нужны только цифры (11,5) , подскажите что нужно сделать?
       
      Часть исходного кода

      -<Child TypeName="DocRecordFieldItem"> -<Properties> <ColumnName>Pр (Pном), кВт</ColumnName> <Value>11,5</Value> </Properties> </Child>
      РП3.xml
    • От doctorraz
      К сожалению после прочтения справки по McCOM2 остались вопросы :
      1. как видно в Locals отладчика VBA : универсальный маркер имеет
      : ClassName : "Универсальный маркер" : String
      на такой запрос:

      Set МаркерСпец = spdsApplication.Query("Универсальный маркер")
      в МаркерСпец возвращается некоторое количество объектов
      но вот если добавить еще условие выбора по полю маркера

      Set МаркерСпец = spdsApplication.Query("Универсальный маркер", "flag=""1""")
      то МаркерСпец Nothing
      в то же время если сделать выборку по всем объектам чертежа:

      Set МаркерСпец = spdsApplication.Query("Object", "flag=""1""")
      то запрос возвращает объекты с данным свойством, но согласитесь, это не совсем верно и удобно.
      Собственно вопрос к гуру, как правильно выбрать объект по имени класса если класс представлен таким образом?
      2. Таблицы и поиск СПДС могут делать выборку по всему документу.
      Вопрос возможно ли через Query собрать объекты со всего документа за один проход (без перебора листов, модели)?
      3. В справке очень лаконично описан объект BOM, однако заинтересовало, что если его получить и заполнить данными, то возможно производить в нем сортировку и пр.
      Вопрос: Как? Возможно у кого то из уважаемых All есть рабочий боевой пример и их не затруднит любезно поделиться.
    • От azaytsev
      Дмитрий Руденко, главный инженер проекта проектного бюро «Фордевинд» http://fordewind.org/.
       
      http://habrahabr.ru/post/238867/
       
      В статье рассмотрен один из вариантов автоматизации работы проектировщиков в САПР nanoCAD, позволяющий в значительной степени использовать параметризацию построений и сокращать сроки выполнения различных задач.
       

       
      Многие проектировщики используют MS Excel для выполнения математических вычислений в табличной форме. Однако, функционал программы этим не ограничивается. С помощью встроенного в продукты Microsoft Office языка программирования Visual Basic for Applications (VBA) можно взаимодействовать с объектной моделью nanoCAD (и другими продуктами на её платформе). В данной статье мы на простом и универсальном примере продемонстрируем такую возможность — создадим и настроим слои, начертим прямоугольник, проставим к нему размеры и добавим текст, содержащий значение площади фигуры.
    • От slovak
      Уважаемое сообщество!
       
      Собственно написал скрипт, который рисует циклоиды:
       

      Dim oLine Dim oCircle Dim A(2, 2000) Dim NumberPoints Dim phi Dim alpha Dim pi Dim Count Dim Rb Dim Rm Dim k Count = 0 pi = 3.1415926 alpha = 0 Rb = 10 Rm = 2 NumberPoints = 360 k = Rb/Rm for phi = 0 to 2*pi step pi/180 Count = Count + 1 A(1, Count) = Rm*(k - 1)*(cos(phi) + cos((k - 1)*phi)/(k - 1)) A(2, Count) = Rm*(k - 1)*(sin(phi) - sin((k - 1)*phi)/(k - 1)) next for phi = 0 to 2*pi step pi/180 Count = Count + 1 A(1, Count) = (Rb + Rm)*cos(phi) - Rm*cos(alpha + ((Rb+Rm)/Rm)*phi) A(2, Count) = (Rb + Rm)*sin(phi) - Rm*sin(alpha + ((Rb+Rm)/Rm)*phi) next Set oCircle = ThisDrawing.ModelSpace.AddCircle(CStr(0)+","+CStr(0)+","+CStr(0), Rb) Set oCircle = ThisDrawing.ModelSpace.AddCircle(CStr(Rb + Rm)+","+CStr(0)+","+CStr(0), Rm) Set oCircle = ThisDrawing.ModelSpace.AddCircle(CStr(Rb - Rm)+","+CStr(0)+","+CStr(0), Rm) for i = 1 to Count - 1 Set oLine = ThisDrawing.ModelSpace.AddLine(CStr(A(1, i))+","+CStr(A(2, i))+","+CStr(0), CStr(A(1, i + 1))+","+CStr(A(2, i + 1))+","+CStr(0)) 'Set oLine = ThisDrawing.ModelSpace.AddLine(CStr(0)+","+CStr(0)+","+CStr(0), CStr(A(1, i))+","+CStr(A(2, i))+","+CStr(0)) 'Set oCircle = ThisDrawing.ModelSpace.AddCircle(CStr(A(1, i))+","+CStr(A(2, i))+","+CStr(0), 0.01) next
       
      Пытаюсь отрисовать их с помощью полилинии.
       
      Для проверки работоспособности пытался нарисовать полилинию:
       

      Dim varVertList(8) Dim objPLine varVertList(0) = 0 varVertList(1) = 0 varVertList(2) = 0 varVertList(3) = 10 varVertList(4) = 10 varVertList(5) = 0 varVertList(6) = 10 varVertList(7) = 50 varVertList(8) = 0 Set objPLine = ThisDrawing.ModelSpace.AddPolyline(varVertList)
       
      В результате получаю:
       

      err: "TeighaX" raised an exception "Параметр задан неверно." at line 17 pos 0 Set objPLine = ThisDrawing.ModelSpace.AddPolyline(varVertList) ^
       

      В каком виде должны быть координаты вершин в массиве varVertList для отрисовки полилинии?



      Пробовал строкой как для отрезка ("x,y,z") - тоже не вышло.


       

      Заранее благодарю за ответ!


       
      К стати, в первом листинге не корректно отображается подсветка синтаксиса строки:
       
      'Set oCircle = ThisDrawing.ModelSpace.AddCircle(CStr(A(1, i))+","+CStr(A(2, i))+","+CStr(0), 0.01)
       
      Строка начинается с " ' ", но не отображается зеленым.
×
×
  • Создать...