Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   Обсуждение скриптов в Системе Базис (https://промебельклуб.рф/forum/showthread.php?t=13614)

Letos 21.03.2018 14:48

Обсуждение скриптов в Системе Базис
 
Если вы не знаете, или не уверены, куда задавать вопрос по скриптам в Системе Базис, то эта тема для вас.

Letos 21.03.2018 14:56

Цитата:

Сообщение от potomu4to (Сообщение 451225)
А можно все таки сделать скрипт чтоб выводил информацию по панели поз. и размер ?

Легко. Общий вариант выглядит так:
Код:

var artPos = panel.ArtPos;
var size = panel.GSize;

Где переменная "panel": объект панели. А переменные artPos и size можете уже выводить, куда угодно.

Letos 21.03.2018 15:16

Цитата:

Сообщение от merowose (Сообщение 451130)
такой скрипт который бы при выборе текущего материала копировал информацию из наименования в поле где прописываться метка. Если есть поделитесь пожалуйста или напишите у кого можно спросить, Спасибо. Базис-салон.
https://cdn1.savepice.ru/uploads/201...55b18-prev.png

Я с Салоном не работал, но могу лишь предположить что, если:
  1. При выборе (смене) текущего материала запускается скрипт
  2. Поле, где прописывается метка можно изменить скриптом
то такой скрипт можно написать. Это лишь мои предположения, поэтому лучше, конечно же, узнать у тех людей, которые работали со скриптами в Салоне.

Uncle 21.03.2018 15:51

Цитата:

Сообщение от Letos (Сообщение 451242)
Легко. Общий вариант выглядит так:

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

Letos 21.03.2018 16:11

Цитата:

Сообщение от Uncle (Сообщение 451248)
Сергей, куда эти строчки вставить? Или может есть возможность выложить полностью готовый скрипт.

Вот готовый скрипт:
Код:

var obj = Model.Selected;
if (obj){
    var artPos = obj.ArtPos;
    var size = obj.GSize;
    alert('Позиция = ' + artPos + '\n' +
        'Размер x =' + Math.round(size.x) + '\n' +
        'Размер y =' + Math.round(size.y) + '\n' +
        'Размер z =' + Math.round(size.z) + '\n')
}

Выделяете объект, запускаете скрипт. Выскочит окошко с информацией о позиции и габаритах в ЛСК объекта.

anb 21.03.2018 16:18

Цитата:

Сообщение от Letos (Сообщение 451250)
Выделяете объект, запускаете скрипт. Выскочит окошко с информацией о позиции и габаритах в ЛСК объекта.

В 9 базисе лицензия, окно не появляется. Если только открыть редактор, вставить в него скрипт и нажать кнопку "запуск F5"
Если данные о выбранной панели конструкции нельзя разместить в окне с моделью, какой смысл в дублировании панели "Свойства"?

Дополню.
Хотя вот сейчас получилось. Но всё же какое назначение данного скрипта?

Letos 21.03.2018 16:39

Цитата:

Сообщение от anb (Сообщение 451251)
Но всё же какое назначение данного скрипта?

Сам не знаю. Формулировка вопроса была следующей:
Цитата:

Сообщение от potomu4to (Сообщение 451225)
А можно все таки сделать скрипт чтоб выводил информацию по панели поз. и размер ?

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

Tehnik 21.03.2018 16:52

Вложений: 1
Цитата:

Сообщение от Letos (Сообщение 451250)
Вот готовый скрипт

Работает.
Наверное, точность после запятой тоже можно свинтить какой-то командой.
Вложение 125939

Letos 21.03.2018 17:15

Цитата:

Сообщение от Tehnik (Сообщение 451256)
Наверное, точность после запятой тоже можно свинтить какой-то командой.
Вложение 125939

Обновил код скрипта в сообщении.

potomu4to 21.03.2018 20:47

Цитата:

Сообщение от Letos (Сообщение 451253)
Куда выводить, я не понял, поэтому вывел через алерт.

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

bbb i ko 25.03.2018 12:02

Как для кромки указать подрезку и размер припуска?

Butt.Material.Allowance = 0.5;
Butt.Material.ClipPanel = true;

пробую так, но результата нет

вопрос закрыт. правильно так:
Butt.Allowance = 0.5;
Butt.ClipPanel = true;

Letos 27.03.2018 17:40

Цитата:

Сообщение от Sergenald (Сообщение 448145)
Есть ли возможность динамически обновлять список в комбобоксах? (newCombo()). И добавлять и удалять по нажатию кнопки.

Спустя время нашел еще один интересный вариант с созданием списков (работает и в окне свойств и в формах. Проверял в 10 версии, но, думаю и в 9 и в 8 будет работать):

Пример


PHP код:

var prevItem;

function 
ItemChoose(item){
    
str.Value item.Caption || item.Name;
    
//Восстановление видимости предыдущего
    // и скрытие текущего елемента
    
if (prevItem){
        
prevItem.Visible true;
    }
    
item.Visible false;
    
prevItem item;
}

var 
str Action.Properties.NewString('Список');
str.ReadOnly true;
var 
dd str.DropDownMenu;
dd.NewButton('btn1').OnClick ItemChoose;
var 
gr dd.NewGroup('group');
gr.NewButton('subBtn1').OnClick ItemChoose;
gr.NewButton('subBtn2').OnClick ItemChoose;
dd.NewNumber('num').OnValueChange ItemChoose;
Action.Continue(); 

[свернуть]

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

Guamoko 04.04.2018 23:42

Скрипты писать только начинаю.
Имею 2 переменные:

DK.Hprm = Props.NewNumber("ВЫС ПРОЕМА");
и
DK.Hdvr = Props.NewNumber("ВЫС ДВЕРИ");
DK.Hdvr.Value=DK.Hprm.Value-40;

Как их связать так, чтобы при изменении значения в окне Hprm менялось значение в окне Hdvr? Пробовал через OnChange, но, видимо неправильно.
Спасибо.

Letos 05.04.2018 09:58

Цитата:

Сообщение от Guamoko (Сообщение 452728)
Скрипты писать только начинаю.
Имею 2 переменные:

DK.Hprm = Props.NewNumber("ВЫС ПРОЕМА");
и
DK.Hdvr = Props.NewNumber("ВЫС ДВЕРИ");
DK.Hdvr.Value=DK.Hprm.Value-40;

Как их связать так, чтобы при изменении значения в окне Hprm менялось значение в окне Hdvr? Пробовал через OnChange, но, видимо неправильно.
Спасибо.

Я так понимаю, свойства отображаются на форме, а не на панели свойств.
Тут косяк с обновлением окна Hdvr. Если есть возможность, лучше делать на панели свойств, ибо они постабильнее работают. На самом деле OnChange - нормальный вариант, но OnValueChange - лучше. Вот примерный костыль для вашей ситуации:
Код:

DK.Hprm.OnValueChange = function (){
  DK.Hdvr.Value = DK.Hprm.Value - 40;
  DK.Hdvr.Layout.Top = DK.Hdvr.Layout.Top   
}

Последняя строка выставляет верхнее положение окна Hdvr таким, каким оно было. С практической точки зрения, эта строка ничего не меняет, но запускает обновление окна, и значение в нем (в окне) становится заданным строкой выше.

Guamoko 05.04.2018 10:11

Спасибо большое. Заработало.Как начинающему, с формами вообще не заморачиваться?

Letos 05.04.2018 10:29

Цитата:

Сообщение от Guamoko (Сообщение 452744)
Спасибо большое. Заработало.Как начинающему, с формами вообще не заморачиваться?

В зависимости от того, что вам надо. Формы выглядят красивее, плюс переход между формами проще, чем пересоздавать свойства на панели свойств. Но вот каждый раз обнаруживаются все новые косяки с формами, и когда их исправят - неизвестно. Но для начинающего, думаю, лучше на панели свойств создавать окна. Оно и постабильнее, и попроще. А сложные/замороченные скрипты можно и на свойствах тоже написать. Вот пример для ознакомления с визуальной составляющей. Лезть в код не советую - там очень много непонятного для новичка (один синтаксис TypeScript уже, наверное, будет пугать).
Подводя итоги: можете работать и со свойствами, и с формами - с чем нравится. А если что непонятно - пишите, вам расскажут, объяснят и помогут.

Guamoko 07.04.2018 13:49

Добрый день.В основной форме можно ли создать нов. диалог. окно(подформу),появляющееся при нажатии на

P.Button1 = Props.NewButton("Название");
P.Button1.SetLayout(10, 12, 100, 22);

и пропадающее при нажатии OK, передавая изменения в основную форму?
спасибо.

Guamoko 08.04.2018 19:21

Цитата:

Сообщение от Guamoko (Сообщение 453012)
Добрый день.В основной форме можно ли создать нов. диалог. окно(подформу),появляющееся при нажатии на

P.Button1 = Props.NewButton("Название");
P.Button1.SetLayout(10, 12, 100, 22);

и пропадающее при нажатии OK, передавая изменения в основную форму?
спасибо.

Нашел в справке:

ScriptMenu-Объект типа всплывающее или выпадающее меню
PopupMenu-Всплывающее меню.
DropDownMenu-Выпадающее меню.

мозгов не хватает, как запустить

Letos 09.04.2018 10:02

Цитата:

Сообщение от Guamoko (Сообщение 453012)
Добрый день.В основной форме можно ли создать нов. диалог. окно(подформу),появляющееся при нажатии на

P.Button1 = Props.NewButton("Название");
P.Button1.SetLayout(10, 12, 100, 22);

и пропадающее при нажатии OK, передавая изменения в основную форму?
спасибо.

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

PHP код:

//вторая форма (подформа)
var childForm NewForm('Вторая форма');
//включаем кнопки "Ок" и "Отмена"
childForm.OKButton true;
childForm.CancelButton true;

//Главная форма
var mainForm NewForm('Главная форма');
var 
mainProps mainForm.Properties;
//Кнопка, при нажатии которой вызывается подформа
var btn1 mainProps.NewButton('button');
btn1.Align AlignType.Top;
btn1.AlignWithMargins true;
btn1.Layout.Top 0;
//Числовое поле, в которое будет записывать результат подформа
var num mainProps.NewNumber('Num');
num.Value 0;
num.Align AlignType.Top;
num.Layout.Top 20;
num.AlignWithMargins true;

//обработчик нажатия на кнопку
btn1.OnClick = function(){
    
// скрываем главную форму
    
mainForm.Visible false;
    
// задаем обработчик нажатия кнопиик "Ок" на подформе
    
childForm.OnOkButtonClick = function (){
        
num.Value 34;
        
// После смены значения в поле, поле не обновляется
        // поэтому задаем ему положение, заставляя обновиться
        
num.Layout.Top 20;
    }
    
// обработчик закрытия подформы
    
childForm.OnClose = function (){
        
// восстанавливаем видимость главной формы при закрытии подформы
        
mainForm.Visible true;
    }
    
// вызываем подформу
    
childForm.Show();
}

//вызываем главную форму
mainForm.Show(); 


Guamoko 09.04.2018 12:05

Спасибо большое. 3 дня бился, но такое не осилил бы. Надеюсь, пока не осилил бы.

Максим Геннадьевич 13.04.2018 13:37

Редактирование контура скриптом
 
Не могу понять как редактировать панель через скрипт.
Выделить и определить какую сторону сделал, а как редактировать не пойму. В справке пример брал, но у меня выдает ошибку по функции.
Спасибо
https://ibb.co/d9hMZ7

Letos 13.04.2018 14:57

Цитата:

Сообщение от Максим Геннадьевич (Сообщение 453472)
Не могу понять как редактировать панель через скрипт.
Выделить и определить какую сторону сделал, а как редактировать не пойму. В справке пример брал, но у меня выдает ошибку по функции.
Спасибо
https://ibb.co/d9hMZ7

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

Guamoko 13.04.2018 17:26

Добрый день. В форме имею
Window1.Material1 = Props.NewMaterial("1я ДВЕРЬ");
и числовое окно,значение которого предполагалось будет зависеть от
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.AktiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
не получается.(не считает)

Добавлено через 12 минут
Другими словами, для выбора формулы мне нужно привязаться к толщине материала
Спасибо.

Letos 13.04.2018 17:47

Цитата:

Сообщение от Guamoko (Сообщение 453493)
Добрый день. В форме имею
Window1.Material1 = Props.NewMaterial("1я ДВЕРЬ");
и числовое окно,значение которого предполагалось будет зависеть от
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.AktiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
не получается.(не считает)

Добавлено через 12 минут
Другими словами, для выбора формулы мне нужно привязаться к толщине материала
Спасибо.

Если я вас правильно понял, то ранее это уже обсуждалось. В формах обновление полей работает, мягко говоря, паршиво. Поэтому после того, как изменили значение, нужно вручную заставить компонент обновиться, например так:
Код:

Window1.BNapl1.Layout.Top = Window1.BNapl1.Layout.Top
По сути, строка является бредовой и не меняет ничего, но где-то внутри базиса запускается обновление поля и новое значение должно корректно отобразиться.

Guamoko 15.04.2018 07:03

Прошу прощения, еще раз прошу помощи.
Для выбора формулы мне нужно считать толщину активного материала из таблицы "используемый материал".При смене материала на материал с другой толщиной меняется формула.

Добавлено через 4 минуты
В моем коде
Window1.Material1.OnChange=function(){
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.ActiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
};
}
указывает на ошибку в 3й строке
Спасибо.

Добавлено через 2 минуты
Но, наверное,мой код вообще не то.

Letos 16.04.2018 09:54

Цитата:

Сообщение от Guamoko (Сообщение 453591)
Прошу прощения, еще раз прошу помощи.
Для выбора формулы мне нужно считать толщину активного материала из таблицы "используемый материал".При смене материала на материал с другой толщиной меняется формула.

Добавлено через 4 минуты
В моем коде
Window1.Material1.OnChange=function(){
Window1.Material1.SetActive();
Window1.ThickMaterial1=Window1.ActiveMaterial.Thic kness;
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
};
}
указывает на ошибку в 3й строке
Спасибо.

Добавлено через 2 минуты
Но, наверное,мой код вообще не то.

У объекта Window1 нет свойства ActiveMaterial (только если вы его не создавали). Если вы хотите получить доступ к текущему активному материалу, строка должна выглядеть так:
Window1.ThickMaterial1 = ActiveMaterial.Thickness;
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле. Но в "ошибочной" строке вы пытаетесь записать толщину материала в переменную этого поля, из-за чего скрипт будет работать неверно.

Подробное пояснение, почему


После выполнения присвоения в третьей строке, в переменной Window1.ThickMaterial1 будет находиться число (16, например). Следующим шагом идет проверка на равенство значений Window1.ThickMaterial1.Value (то есть 16.Value) и 10. У переменной Window1.ThickMaterial1 числовое значение, у которого, в свою очередь, свойство Value отсутствует. В итоге Window1.ThickMaterial1.Value вернет undefined и условие будет выглядеть так:
if (undefined == 10).
В итоге, это условие не будет никогда верным, но из-за особенностей JS, оно не является ошибочным, поэтому скрипт продолжит работу.
[свернуть]


Выход из этой ситуации следующий: третью строку необходимо исправить, чтобы она выглядела так:
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

P.S На будущее: если скрипт выдает ошибку, связанную с вашим вопросом, неплохо было бы и текст ошибки тоже добавлять, ведь в ней сказано почти все, что нужно для поиска ошибки и причин ее возникновения.

Guamoko 17.04.2018 04:46

Цитата:

Сообщение от Letos (Сообщение 453679)
У объекта Window1 нет свойства ActiveMaterial (только если вы его не создавали). Если вы хотите получить доступ к текущему активному материалу, строка должна выглядеть так:
Window1.ThickMaterial1 = ActiveMaterial.Thickness;
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле. Но в "ошибочной" строке вы пытаетесь записать толщину материала в переменную этого поля, из-за чего скрипт будет работать неверно.

Подробное пояснение, почему


После выполнения присвоения в третьей строке, в переменной Window1.ThickMaterial1 будет находиться число (16, например). Следующим шагом идет проверка на равенство значений Window1.ThickMaterial1.Value (то есть 16.Value) и 10. У переменной Window1.ThickMaterial1 числовое значение, у которого, в свою очередь, свойство Value отсутствует. В итоге Window1.ThickMaterial1.Value вернет undefined и условие будет выглядеть так:
if (undefined == 10).
В итоге, это условие не будет никогда верным, но из-за особенностей JS, оно не является ошибочным, поэтому скрипт продолжит работу.
[свернуть]


Выход из этой ситуации следующий: третью строку необходимо исправить, чтобы она выглядела так:
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

P.S На будущее: если скрипт выдает ошибку, связанную с вашим вопросом, неплохо было бы и текст ошибки тоже добавлять, ведь в ней сказано почти все, что нужно для поиска ошибки и причин ее возникновения.

Добавлено через 29 минут
Спасибо большое. С Вашими поправками
Цитата:

Сообщение от Guamoko (Сообщение 453748)
Window1.ThickMaterial1.Value = ActiveMaterial.Thickness;

заработало,но только после того,

Цитата:

Сообщение от Guamoko (Сообщение 453748)
И еще одна странная вещь в вашем коде. Это как раз то же самое присвоение. Судя по коду, Window1.ThickMaterial1 - это числовое поле.

как я создал поле и присвоил ему значение Window1.ThickMaterial1.Value= ActiveMaterial.Thickness;
Вообще-то, мне это поле не нужно и в своем варианте
Window1.ThickMaterial1.=ActiveMaterial.Thickness;
я предполагал, что ThickMaterial1-переменная, принимающая значение толщины активного материала.А уже от этой переменной зависило
if(Window1.ThickMaterial1.Value==10){
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
Возможно ли обойтись без поля? Если нет,я его скрою, присвоив Visible-false
Еще раз позволю себе повторить задачу,которую хотелось бы решить.
1)Объявить переменную,принимающую значение толщины активного материала.
2)при изменении материала,если толщина активного материала=10,запустить формулу
Window1.BNapl1.Value=Window1.LGProf.Value+15;
Window1.BNapl1.Layout.Top=Window1.BNapl1.Layout.To p;
которая выводит результат вычисления в окно BNapl1.

Letos 17.04.2018 09:28

Цитата:

Сообщение от Guamoko (Сообщение 453748)
Возможно ли обойтись без поля?

Конечно можно. Но если вам переменная нужна только для этого случая, то лучше и назвать ее покороче и отделить от объекта Window1. Например так:
Код:

var thick = ActiveMaterial.Thickness;
if (thick == 10)
//и дальше по коду

И еще немного теории: если переменную создавать в объекте Window1, то она будет существовать в этом объекте, пока тот не будет уничтожен (предположительно, до завершения скрипта). А если объявить переменную как на примере выше, то она будет существовать в пределах блока, в котором объявлена (то есть, по завершении обработчика события, переменная будет уничтожена, а память освобождена). Применительно к скриптам, это, скорее, "правило хорошего тона". За все время пользования скриптами я еще ни разу не видел скрипта, который бы замедлял работу Базиса из-за использования большого количества переменных. Из ощутимых плюсов я могу назвать наверное только упрощение работы в отладчике - меньше лишних переменных отображается.

Guamoko 17.04.2018 09:45

Спасибо огромное. Все заработало как хотелось.
Теорию я читаю,не просто тупо прошу выдать ответ.Просто доходит не так быстро как хотелось бы. Еще раз спасибо. Удачи.

Rudolf 18.04.2018 10:13

Добрый день.
Есть ли возможность имортировать через скрипт в Базис 8 данные из формата csv, например
артикул1;длина1;ширина1;колво1
артикул2;длина2;ширина2;колво2
...
После импорта будут созданы панели с этими параметрами.

Letos 18.04.2018 11:41

Цитата:

Сообщение от Rudolf (Сообщение 453853)
Добрый день.
Есть ли возможность имортировать через скрипт в Базис 8 данные из формата csv, например
артикул1;длина1;ширина1;колво1
артикул2;длина2;ширина2;колво2
...
После импорта будут созданы панели с этими параметрами.

Вот пример для описанного Вами случая:
PHP код:

//имя файла
var csvName system.askFileName('csv');
//содержимое файла
var content system.readTextFile(csvName);
// массив, элемент которого равен строке из файла
var panels content.split('\r\n');
// позиция (геометрическая) панели
var curPos NewVector(0,0,0);
for (var 
0panels.lengthi++){
    
// массив, содержащий информацию по конкрентой панели
    
var panel panels[i].split(';');
    
// Позиция (артикул) панели
    
var art panel[0];
    
//длина панели
    
var length panel[1];
    
//ширина панели
    
var width panel[2];
    
// кол-во панелей
    
var count panel[3];
    for (var 
0countk++){
        
//добавление панели
        
var AddVertPanel(00widthlength0);
        
//назначение позиции (артикула)
        
p.ArtPos art;
        
// назначение позиции геометрической
        
p.Position curPos;
        
// увеличение позиции по х, чтобы все панели были на одной линии
        
curPos.+= 50;
    }


Писал в 10 версии, но, думаю, будет работать во всех. Если вдруг не заработает, запустите его из встроенного редактора и напишите текст ошибки, попробую исправить.

Uncle 18.04.2018 12:07

Цитата:

Сообщение от Letos (Сообщение 453869)
PHP код:

Сергей, просветите, пожалуйста, что сделать с PHP-кодом, что бы он стал полноценным скриптом ? ) То есть, вставил в редактор скриптов и сразу можно нажимать Запуск ..

Letos 18.04.2018 12:23

Цитата:

Сообщение от Uncle (Сообщение 453874)
Сергей, просветите, пожалуйста, что сделать с PHP-кодом, что бы он стал полноценным скриптом ? ) То есть, вставил в редактор скриптов и сразу можно нажимать Запуск ..

Да. Контейнер "PHP код" я использовал для более красивого отображения на форме, ибо контейнер "код" пишет все сплошным текстом без выделения ключевых слов и комментариев.

Rudolf 18.04.2018 13:29

Огромное спасибо. *THUMBS UP*
Все работает на 99% - читает из файла и создает детали, но почему-то размером 2х2 :)
Алерты перед AddVertPanel показывают правильные цифры, разбираюсь.

Rudolf 19.04.2018 10:54

Нашел проблему.
Значения размеров записывались в переменные как строка.
Вот такой все заработало:
PHP код:

var csvName system.askFileName('csv');
var 
content system.readTextFile(csvName);
var 
panels content.split('\r\n');
var 
curPos NewVector(0,0,0);
for (var 
0panels.lengthi++){
    var 
panel panels[i].split(';');
    var 
art panel[0];
    var 
length Number(panel[1]); // из строки в число
    
var width Number(panel[2]); // из строки в число
    
var count panel[3];
    for (var 
0countk++){
        var 
AddVertPanel(00widthlength0);
        
p.Name art// у меня артикул - имя
        
p.Position curPos;
        
curPos.+= 50;
    }



bbb i ko 19.04.2018 21:24

Вложений: 1
Подскажите пож.(не нашел в мануале): как назначить ориентацию текстуры для создаваемой панели HPanel=AddHorizPanel(...) ?
и еще такой вопрос: кромку на панель ставлю так:
for(var side_butt=0; side_butt < 4; side_butt++){
Butt_Material = arr[row][4+side_butt*3];
if (Butt_Material != '')
{
Butt = HPanel.Butts.Add();
Butt.Material = arr[row][4+side_butt*3];
Butt.Material.Allowance = 0.5;
Butt.Material.ClipPanel = true;
Butt.ElemIndex = side_butt;
Butt.Sign = arr[row][6+side_butt*3];
Butt.Thickness = Number(arr[row][5+side_butt*3],10);
}
}
}
в итоге толщина кромки в БМ не попадает, хотя в исходнике(строка CSV) толщина присутствует
соответственно, что делаю неправильно?

Letos 20.04.2018 10:00

Цитата:

Сообщение от bbb i ko (Сообщение 454023)
Подскажите пож.(не нашел в мануале): как назначить ориентацию текстуры для создаваемой панели HPanel=AddHorizPanel(...) ?

HPanel.TextureOrientation = TextureOrientation.Horizontal; //Например

Цитата:

Сообщение от bbb i ko (Сообщение 454023)
и еще такой вопрос: кромку на панель ставлю так:
for(var side_butt=0; side_butt < 4; side_butt++){
Butt_Material = arr[row][4+side_butt*3];
if (Butt_Material != '')
{
Butt = HPanel.Butts.Add();
Butt.Material = arr[row][4+side_butt*3];
Butt.Material.Allowance = 0.5;
Butt.Material.ClipPanel = true;
Butt.ElemIndex = side_butt;
Butt.Sign = arr[row][6+side_butt*3];
Butt.Thickness = Number(arr[row][5+side_butt*3],10);
}
}
}
в итоге толщина кромки в БМ не попадает, хотя в исходнике(строка CSV) толщина присутствует
соответственно, что делаю неправильно?

Сделал тестовый пример у себя на основе вашего кода - у меня все нормально (БМ10). Все, написанное ниже относится к 10 версии, поэтому где-то я могу быть не прав:
1. Вот эти две строки мне не понятны:
Код:

Butt.Material.Allowance = 0.5;
Butt.Material.ClipPanel = true;

в БМ10 свойство Material - строковое. А свойства Allowance и ClipPanel доступны у объекта кромки. Думаю, эти строки должны быть такими:
Код:

Butt.Allowance = 0.5;
Buttl.ClipPanel = true;

2. Самый простой способ проверить, проверить, почему толщина кромки не попадает, это алертом вывести толщину, например:
Код:

alert(Number(arr[row][5+side_butt*3],10))
Butt.Thickness = Number(arr[row][5+side_butt*3],10);

алерт выведет, какое значение вы пытаетесь получить.
Кстати, с дробными числами есть еще одна неприятная вещь: если в строке разделитель дроби - запятая, а не точка, то такое преобразование вернет Nan. Возможно, в этом проблема.


P.S. И, напоследок, пара советов:
  1. У вас идет два присвоения одного и того же сложного значения:
    Код:

    //1
    Butt_Material = arr[row][4+side_butt*3];
    //промежуточный код
    //2
    Butt.Material = arr[row][4+side_butt*3];

    Предлагаю во второй раз брать значение из уже заданной переменной:
    Код:

    //1
    Butt_Material = arr[row][4+side_butt*3];
    //промежуточный код
    //2
    Butt.Material = Butt_Material;

    Так уже идет доступ сразу к Butt_material, а не к arr->arr[row]->arr[row][4+side_butt*3]. Но, что более важно, если что-то изменится (например, нужно будет брать значение не из [4+side_butt*3], а из [2+side_butt*2]), то править код надо будет всего в одном месте, что уменьшает вероятность ошибки при запуске измененного/исправленного кода
  2. У вас очень часто повторяется arr[row]. Можно и его записать в отдельную переменную. Особо видимых плюсов не принесет, поэтому это из разряда "придраться".
  3. И еще из разряда "придраться" по поводу правил хорошего тона. В JS принято называть переменные с маленькой буквы (а названия функций и классов - с большой). Из видимых плюсов - меньше Shift лишний раз нажимать:).

bbb i ko 20.04.2018 17:44

Цитата:

Сообщение от Letos (Сообщение 454052)
Кстати, с дробными числами есть еще одна неприятная вещь: если в строке разделитель дроби - запятая, а не точка, то такое преобразование вернет Nan. Возможно, в этом проблема.

да, спасибо - дело было именно в запятой. Исправил на точку - и все ок.
Сбило с толку, что в материале толщина проставляется, а в кромке - нет. А там как раз целочисленное значение просто.

Максим Геннадьевич 25.04.2018 15:11

Цитата:

Сообщение от Letos (Сообщение 453481)
И еще хотелось бы узнать, какую ошибку выдает.

Ошибка была банальная. Пример брался из справки Subtraction(contour) и в примере допущена ошибка c.Substraction(Hole).

wizardpnz 25.05.2018 08:22

Вложений: 1
это можно сделать в смете без скриптов назначив каждому материалу сопутствующий материал вес

добавил сопутствующий материал МАССА 1кг на 1кв м зеркала


Текущее время: 08:47. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL