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

Не получается заставить работать SelectAtPoint


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

Не могу добиться работы функции SelectAtPoint

Есть тестовый код (JS):

ThisDrawing.Utility.Prompt ("Чертим горизонтальную линию");
ThisDrawing.ModelSpace.AddLine("0,0,0", "100,0,0");
var pFind = new Array(50,0,0); //Координаты выбора объекта
// Создаем выборку
try {
var sSelect = ThisDrawing.SelectionSets.Add("SS1");
}
catch(exept) {
ThisDrawing.Utility.Prompt ("Ошибка создания выборки: " + exept);
ThisDrawing.Utility.Prompt ("Выбираем существующую выборку!");
var sSelect = ThisDrawing.SelectionSets.Item("SS1");
}
ThisDrawing.Utility.Prompt ("Рабочий шаблон выбора: " + sSelect.Name);
sSelect.Clear();
//Типизируем массив с координатами
var pFindTyped = ThisDrawing.Utility.CreateTypedArrayFromJSArray(5, pFind);
ThisDrawing.Utility.Prompt ("Пытаемся добавить начерченную линию в выборку");
sSelect.SelectAtPoint(pFindTyped , 0, "Line");
// Удаляем выборку
sSelect.Delete();
ThisDrawing.Utility.Prompt ("Скрипт завершен!");

 

При попытке выполнения выдает ошибку: "TeighaX" raised an exception "Invalid ResBuf"

Всю голову сломал...

Пробовал указывать координаты как текст "50,0,0", преобразовывал через PolarPoint("50,0,0", 0,0) - всё одно и тоже.

Если использовать нетипизированный массив выдает сообщение: "TeighaX" raised an exception "Параметр задан неверно."

 

Как в этом методе задать точку?

 

PS: И ещё. Возможно вопрос ламерский, но что означает параметр "5" в CreateTypedArrayFromJSArray?

Какие возможно указать типы данных и как они обозначаются?

И где это описано?

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

Засада, скорее всего, в самом методе SelectAtPoint - ну не получается его заставить работать.

В принципе, вместо него можно воспользоваться просто Select-ом (секущая рамка, стянутая в точку) - примерно так :

//sSelect.SelectAtPoint(pFindTyped , 0, "Line");
// меняем на
sSelect.Select(acSelectionSetCrossing, pFindTyped, pFindTyped, 0, "Line");

 

После этого скрипт отрабатывает. Правда, есть еще одна тонкость - он при этом ничего не выбирает. Дело в том, что для того, чтобы Select (любой) сработал для какого-либо объекта, НЕОБХОДИМО, чтобы этот объект нарисовался на экране хотя бы однажды. Поэтому для того, чтобы вновь созданные объекты начали восприниматься Select-ом нужно как-то инициировать перерисовку. Самый простой способ - позвать ThisDrawing.Application.Update(). Кроме того, все методы пользовательского ввода (Utility.GetXXX) также инициируют перерисовку.

 

так что в окончательном варианте этот примерчик будет выглядеть примерно так :

 

ThisDrawing.Utility.Prompt ("Чертим горизонтальную линию");
ThisDrawing.ModelSpace.AddLine("0,0,0", "100,0,0");
// !!! Перерисуем
ThisDrawing.Application.Update();

var pFind = new Array(50,0,0); //Координаты выбора объекта
// Создаем выборку
try {
var sSelect = ThisDrawing.SelectionSets.Add("SS1");
}
catch(exept) {
ThisDrawing.Utility.Prompt ("Ошибка создания выборки: " + exept);
ThisDrawing.Utility.Prompt ("Выбираем существующую выборку!");
var sSelect = ThisDrawing.SelectionSets.Item("SS1");
}
ThisDrawing.Utility.Prompt ("Рабочий шаблон выбора: " + sSelect.Name);
sSelect.Clear();
//Типизируем массив с координатами
var pFindTyped = ThisDrawing.Utility.CreateTypedArrayFromJSArray(5, pFind);
ThisDrawing.Utility.Prompt ("Пытаемся добавить начерченную линию в выборку");
//sSelect.SelectAtPoint(pFindTyped , 0, "Line");
// !!!! Позовем Select вместо SelectAtPoint
sSelect.Select(acSelectionSetCrossing, pFindTyped, pFindTyped, 0, "Line");
// !!! Ну и напечатаем, сколько объектов выбрано
ThisDrawing.Utility.Prompt ("Выбрфно объектов : " + sSelect.Count);
// Удаляем выборку
sSelect.Delete();
ThisDrawing.Utility.Prompt ("Скрипт завершен!");

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

О! Огромное спасибо за совет!!!

Тоже уже решил на Select перейти, но вариант почему-то не работает (кол-во выбранных элементов = 0):

ThisDrawing.Application.Update();
sSelect.Select(acSelectionSetCrossing, pFindTyped, pFindTyped, 0, "Line");

А так работает:

sSelect.Select(acSelectionSetCrossing, "-1,-1,0", "1,1,0", 0, "Line");

Так опять не работает:

sSelect.Select(acSelectionSetCrossing, "-0.01,-0.01,0", "0.01,0.01,0", 0, "Line");

Перерисовка что ручная, что по Application.Update() не помогает...

("Тренируюсь" на nanoCAD верии 3.7.1913.1236)

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

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

Чтобы получить нечто вразумительное - надо извращаться. логика такая : надо задать вокруг нужного места квадратик размером в пиксель (или N пикселей - как делает "тычковая" селекция), но задать его в мировых координатах. а вот как его получить - сходу не скажу, это надо ковыряться. :)

 

Но все дело в масштабе! :(

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

Не могу добиться работы функции SelectAtPoint

При попытке выполнения выдает ошибку: "TeighaX" raised an exception "Invalid ResBuf"

 

Записал ошибку в багтрекер Клуба разработчиков под номером #46.

 

PS: И ещё. Возможно вопрос ламерский, но что означает параметр "5" в CreateTypedArrayFromJSArray?

Какие возможно указать типы данных и как они обозначаются?

И где это описано?

 

Описано в ncX_app_ref.chm, но увы, описано неправильно. Записал ошибку в багтрекер Клуба разработчиков под номером #47.

 

Type, это VARENUM, где 5 это VT_R8.

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

Вопрос по фильтрам в Select.

Мне нужно выбрать все блоки с атрибутами по пространствам.

 

 

'перерисовываем'
ThisDrawing.Application.Update
'для каждого пространства ищем блоки с атрибутами'
For i = 0 To (ThisDrawing.Layouts.Count - 1)  

Set os = ThisDrawing.SelectionSets.Add("tempgr")

pt1(0)=0: pt1(1)=0: pt1(2)=0
pt2(0)=0: pt2(1)=0: pt2(2)=0
ThisDrawing.Utility.CreateTypedArray pt3, 5, pt1(0), pt1(1), pt1(2)
ThisDrawing.Utility.CreateTypedArray pt4, 5, pt2(0), pt2(1), pt2(2)

intType(0) = 0: varData(0) = "INSERT"  'блок'
intType(1) = 66: varData(1) = 1		'имеет атрибуты'
intType(2) = 410: varData(2) = ThisDrawing.Layouts(i).name   'пространство листа или модели'

os.Select 5,pt3,pt4,intType,varData 'набор блоков с атрибутами в  данном пространстве модели или листа, 5 = acSelectionSetAll добавляет в набор все объекты'
'os.Select 5,pt3,pt4,66,"1" '
For Each Item In os
'некое действие'		
Next

ThisDrawing.SelectionSets.Item("tempgr").Delete
Set os = Nothing

Next

 

не проходит выборка с фильтрами в виде массивов intType и varData

если их типизировать, то затыкается на типизации varData, т.к. там данные разного типа видимо.

 

Если по одному параметру отбирать, то работает, например:

os.Select 5,pt3,pt4,66,"1" '

но тогда подскажите пожалуйста, как из блока вытащить в каком пространстве он расположен? Модели или конкретного Листа?

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

Нашла на свой последни й вопрос ответ:

Set ObjSpace=ThisDrawing.ObjectIdToObject(block.OwnerID) 

 

но про фильтры вопрос открытый

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

Вообще-то, по логике вещей, Select должен выбирать объекты только из текущего спейса (модель\активный лист), не трогая остальные спейсы - это же, по сути, тот же самый select, что на экране происходит, и других лэйаутов ему не видно.

А фильтры... фильтры - штука чудная, так что, имхо, гораздо проще выбрать сначала все объекты подряд, а потом отфильтровать руками :)

Но будем посмотреть! :)

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

Вообще-то, по логике вещей, Select должен выбирать объекты только из текущего спейса (модель\активный лист), не трогая остальные спейсы - это же, по сути, тот же самый select, что на экране происходит, и других лэйаутов ему не видно.

Нет, нет, все замечательно выбирается по всем листам.

 

Но вот сейчас попробовала, если активен какой-нибудь лист, у меня скрипт не срабатывает.

а если пространство модели, то работает, при этом находит все нужные блоки на разных листах и ставит там то, что мне надо.

Ссылка на сообщение
Поделиться на другие сайты
  • 9 месяцев спустя...

У меня не получается с AddItem, выдает кол-во 0

 

 

Set os1= ThisDrawing.SelectionSets.Item("$tempgr1$")
os1.Clear()
Set obj_arr(0)=block1
Set obj_arr(1)=block2
os1.AddItems obj_arr
MsgBox os1.Count

 

block1 и block2 это ранее вставленные два блока в чертеж

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

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

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

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

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

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

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

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

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

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

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