Цитата:
Сообщение от Mullerr
Нужен скрипт для БМ8, со следующим алгоритмом работы:
Выделяем блок -> нажимаем скрипт -> внутри блока расставляются позиции деталей 1, 2, 3, 4... по порядку. Внутри каждого выделенного блока нумерация должна начинаться с 1, если до этого присутствовали старые номера деталей, то они удаляются и переставляются заново, детали должны проходить проверку на идентичность (на одинаковые детали внутри блока должен ставится один и тот же номер).
Может кто-нибудь сделать такой скрипт для БМ8 или дать ссылку?
|
Уточните что должно происходить если блок находится внутри другого блока?
ответа не дождался.
хотите заново расставить позиции внутри выделенного блока, то
var Obj = Model.Selected;
Action.ArrangePositions(0, Obj);
хотите прогнать по такому алгоритму всю модель, не выделяя блок:
сначала происходит штатная расстановка позиций средствами базиса, регулируется в настройках расстановки позиций - это необходимо для назначения одинаковым объектам одинаковых позиций.
далее смотрим верхний уровень модели простым перебором, если объект имеет позицию, значит он объект на который нужно смотреть.
для временного объекта artpos создаем свойство с именем позиции рассматриваемого объекта и значение по порядку от нуля, либо пропускаем если свойство уже имеет значение, т.е. такая позиция рассматривалась.
снова проходим верхний уровень, но теперь смотрим позицию объекта, используем позицию в качестве названия свойства artpos и переназначаем позицию на значение свойства artpos.
далее проходим всю модель циклом forEach - он проходит все элементы модели независимо от иерархии. если рассматриваемый объект является структурным (блок, сборка и т.д.), то для него делаем все что описано выше.
//перебираем структуру
//если объект имеет позицию, то в дальнейшем меняем ее
function NumPos(Group) {
var artpos = {};
var numpos = 0;
for (var i = 0; i < Group.Count; ++i) {
if (Group.Objects[i].ArtPos > 0) {
if (!artpos[Group.Objects[i].ArtPos]) {
++numpos;
artpos[Group.Objects[i].ArtPos] = numpos;
}
}
}
for (var i = 0; i < Model.Count; ++i) {
if (Group.Objects[i].ArtPos > 0) {
Group.Objects[i].ArtPos = artpos[Group.Objects[i].ArtPos];
}
}
}
//расставляем позиции штатным методом базиса
//далее будем смотреть именно на объекты у которых есть позиция
Action.ArrangePositions(0, Model);
//перебор верхнего уровня модели
NumPos(Model);
//перебор всей модели на наличие структурных объектов - блок один из них
//находим стр.объект, перебираем его объекты
Model.forEach(function(Obj) {
if (Obj.List) {
NumPos(Obj);
}
});
корректно работает в БМ11, насчет БМ8 сказать не могу, но думаю все будет норм.