|
|
|
|
|
06.06.2017, 08:56
|
|
БАЗИС 10 - Скрипты
systland
VIP
Регистрация: 30.10.2007
Адрес: Москва
Сообщений: 565
Сказал(а) спасибо: 303
Поблагодарили 451 раз(а) в 189 сообщениях
06.06.2017, 08:56
Рейтинг:
()
Обмениваемся , задаем вопросы, отвечаем... Все, что касается скриптов в БМ 10 в этой теме.
Последний раз редактировалось systland; 26.12.2017 в 11:52..
|
Просмотров: 437178
|
14.06.2019, 16:16
|
#431
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от TProject
Уважаемые мебельщики, помогите коллеге. Возникла потребность расстановки позиций с помощью скрипта на выделенные детали. Если у кого то есть подобный скрипт, поделитесь пожалуйста.
|
В скриптах расстановка позиций доступна только на всю модель. Пилить собственную расстановку вряд ли кому приходило в голову, потому что сравнение объектов - задача трудоёмкая. В результате остаётся один вариант:
Цитата:
Сообщение от Ovsyanicov
Выделяете детали и нажимаете кнопку "Расставить позиции заново".
|
|
|
|
Пользователь сказал cпасибо:
|
|
14.06.2019, 16:26
|
#432
|
Новичок
Регистрация: 18.11.2018
Сообщений: 25
Сказал(а) спасибо: 24
Поблагодарили 28 раз(а) в 6 сообщениях
Вес репутации: 0
|
Цитата:
Сообщение от Letos
В скриптах расстановка позиций доступна только на всю модель. Пилить собственную расстановку вряд ли кому приходило в голову, потому что сравнение объектов - задача трудоёмкая. В результате остаётся один вариант:
|
Да, представления имел... что переменные, сравнения и т.д. Код возможно даже тяжелый был бы, (не изучал программирования, только поверхностные знания имею) но вдруг, все же кто то делал. В этом и вопрос.
|
|
|
24.06.2019, 10:03
|
#433
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 387
|
Как удалить после Action.Commit() ?
p = Model.Selections[0]
pCopy = AddCopy(p);
Action.Commit()
DeleteObject(pCopy); //Здесь не работает.
Или сразу главный вопрос:
Как определить какие именно отверстия из фурнитуры цепляют конкретную панель?
Если, например, в фурнитурине 6 отверстий и больше.
|
|
|
24.06.2019, 14:44
|
#434
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от v22884
Как определить какие именно отверстия из фурнитуры цепляют конкретную панель?
|
можно получить список фурнитуры, скрепляющей панель через panel.FindConnectedFasteners(). Встроенной функции, определяющей, что отверстие находится в конкретной панели, нет. Здесь есть самописный скрипт для выделения панелей с торцевыми отверстиями. В случае вашей задачи, вам не нужна функция CheckWithPanel() (она проверяет соответсвие направления отверстия с направлениями Х и У в ЛСК панели). Основная нужная функция - CheckHole(hole, fast, panel) вернёт true, если отверстие (hole), принадлежащее фурнитуре (fast) находится в панели (panel).
Цитата:
Сообщение от v22884
Как удалить после Action.Commit() ?
p = Model.Selections[0]
pCopy = AddCopy(p);
Action.Commit()
DeleteObject(pCopy); //Здесь не работает.
|
После Action.Commit() объекты копируются из временной области модели в саму модель, соответственно объекта pCopy после коммита не существует. Если вы точно знаете, что будет делать ваш код, то можно попробовать следующий трюк:
Т.к. добавление объектов в модель идёт последовательно, то при добавлении 5 объектов скриптом в модель, последние 5 объектов - добавленные скриптом (небольшая оговорочка - если добавлен блок, содержащий 4 объекта, то в модели последним объектом будет блок, а остальные 4 будут внутри блока, согласно иерархии).
Вот небольшой пример по добавлению объекта, применению изменений и удалению объекта:
PHP код:
// Добавление панели
AddPanel(100, 1000).Owner;
// Применение действий скрипта с записью в историю
Action.Commit();
// Удаление последнего объекта в модели (панели, добавленной скриптом)
DeleteObject(Model.Objects[Model.Count - 1]);
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
27.06.2019, 12:55
|
#435
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 387
|
Как получить контур панели с подрезкой канта?
|
|
|
27.06.2019, 16:38
|
#436
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от v22884
Как получить контур панели с подрезкой канта?
|
Я так понимаю, подрезка канта берётся из параметров кромки? Раньше уже был такой вопрос:
Цитата:
Сообщение от wizardpnz
есть способ получить размер заготовки с учётом минуса под подрезку кромки, или только вычислять ?
|
Написал для этого простой скрипт (простота заключается в том, что он обрабатывает только прямоугольные панели и только линии):
PHP код:
const SHIFT = {
unknown : 0,
left : 1,
right : 2,
top : 3,
bottom : 4
}
function MakeShift(sType, sValue) {
return {
type: sType, // тип сдвига
value: sValue, // значение сдвига
}
}
/**
* Получить положение линии относительно контура
* @param {Contour2D} cont Контур
* @param {Line2D} line Линия
*/
function GetLinePos(cont, line) {
/**
* Центр линии
*/
var lineC = {
x: (line.Pos1.x + line.Pos2.x) / 2,
y: (line.Pos1.y + line.Pos2.y) / 2
}
var result = SHIFT.unknown;
// Если точка, сдивнутая в сторону, находится внутри контура,
// значит контур надо сдвигать в обратную сторону
if (cont.IsPointInside(lineC.x, lineC.y + 1))
result = SHIFT.bottom;
else if (cont.IsPointInside(lineC.x, lineC.y - 1))
result = SHIFT.top;
else if (cont.IsPointInside(lineC.x + 1, lineC.y))
result = SHIFT.left;
else if (cont.IsPointInside(lineC.x - 1, lineC.y))
result = SHIFT.right;
return result;
}
/**
* Применить сдвиги к контуру
* @param {Contour2D} cont
* @param {*} shifts
*/
function applyShifts(cont, shifts) {
var min = cont.Min;
var max = cont.Max;
for (var i = 0; i < shifts.length; i++) {
var shift = shifts[i];
switch (shift.type) {
case SHIFT.left:
min.x += shift.value;
break;
case SHIFT.right:
max.x -= shift.value;
break;
case SHIFT.top:
max.y -= shift.value;
break;
case SHIFT.bottom:
min.y += shift.value;
break;
}
}
cont.Fit(min.x, min.y, max.x, max.y);
}
/**
* Подрезать контур на толщину кромок с подрезкой
* @param {Contour2D} cont
* @param {PanelButts} butts
*/
function ClipContour(cont, butts){
var shifts = [];
if (cont.IsContourRectangle()) { // Только прямоугольный контур
for (var i = 0; i < butts.Count; i++) {
var butt = butts.Butts[i];
if (butt.ClipPanel){
var line = cont.Objects[butt.ElemIndex];
if (!line.IsLine()) // Если элемент не линия - ничего не делаем
continue;
shifts.push(MakeShift(GetLinePos(cont, line), butt.Thickness));
}
}
applyShifts(cont, shifts);
}
}
var panel = Model.Selected.AsPanel;
var cont = NewContour();
cont.Addition(panel.Contour);
var butts = panel.Butts;
ClipContour(cont, butts);
var size = {
x: cont.Max.x - cont.Min.x,
y: cont.Max.y - cont.Min.y
}
alert(`Размеры: ${size.x}x${size.y}`);
В примере нужно выделить панель, запустить скрипт и алертом выведутся размеры подрезанной заготовки. Для вашей задачи (получить подрезанный контур), нужно использовать функцию ClipContour(cont, butts), которая подрезает контур (cont) на основе данных о кромках (butts). Лучше в эту функцию передавать копию контура панели, иначе после выполнения скрипта, контур панели изменится.
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
03.07.2019, 08:58
|
#437
|
Пользователь
Регистрация: 25.11.2016
Адрес: г. Уфа
Сообщений: 38
Сказал(а) спасибо: 39
Поблагодарили 4 раз(а) в 3 сообщениях
Вес репутации: 0
|
Хорошего дня всем! А сеть скрипт для восстановления пароля от Базы материалов? Найти не могу. Поможете? Спасибо заранее
|
|
|
04.07.2019, 07:15
|
#438
|
Местный
Регистрация: 02.07.2011
Сообщений: 191
Сказал(а) спасибо: 93
Поблагодарили 105 раз(а) в 44 сообщениях
Вес репутации: 196
|
нужно открыть файл базы данных в стороннем редакторе и там есть таблица типа user или accaunt и удалить там записи с паролями
Последний раз редактировалось wizardpnz; 04.07.2019 в 07:56.
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
06.07.2019, 06:21
|
#439
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 387
|
Главная задача: DXF с отверстиями по слоям с именами, например o7, o8h10, и т.п.
На этом пути промежуточный результат дырки в панелях:
(спасибо Letos)
Скрытый текст
Model.forEachPanel(function(p) {
fs = krepej(p)
//alert(fs[0])
// fs = fs.split(",")
Dyriavim(fs,p)
}
)
function krepej(p)
{
if(!p.AsPanel) {return}
ar = p.FindConnectedFasteners(p)
return ar
}
function Dyriavim(fs,p)
{
// alert(fs[0])
for(iif=0;iif<fs.length;iif++)
{
f=fs[iif]
// alert(f)
c = f.Holes;
var i = 0;
сk = f.Holes.Count;
HoleCon = NewContour();
while (i < сk) {
if(!CheckHole(c[i],f, p)&&!CheckHole2(c[i],f, p))
{
i++
continue
}
if (CheckWithPanel(f.NToGlobal(c[i].Direction), p))
{
i++
continue
}
if (c[i].Radius<1.9/2)
{
i++
continue
}
HolePosG = f.ToGlobal(c[i].Position);
p.Selected = false
HolePosG = p.ToObject(HolePosG)
if (c[i].Contour==null)
{
HoleCon.AddCircle(HolePosG.x, HolePosG.y, c[i].Radius)
}
else
{
HoleCon.AddList(c[i].Contour.MakeCopy());
HoleCon.Move(HolePosG.x, HolePosG.y)
}
i++
}
MoykaPos = c.Position;
StartEditing(p)
Undo.Changing(p)
//StartEditing(p)
p.Contour.Subtraction(HoleCon);
system.log(p.ArtPos+ " -- "+p.Name)
p.Build()
}
}
// Чуть доработан скрипт Letos'a (длинные отверстия не дырявил)
function CheckHole2(hole,fast, panel){
for(id=1;id<20;id++)
{
if(CheckHole(hole,fast, panel,id/20))
{
return true
}
}
return false
}
function CheckHole(hole,fast, panel,delim){
var holeCenter = fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * (hole.Depth * delim),
y: hole.Position.y + hole.Direction.y * (hole.Depth * delim),
z: hole.Position.z + hole.Direction.z * (hole.Depth * delim),
})
holeCenter = panel.ToObject(holeCenter);
return (holeCenter.x > panel.GMin.x) && (holeCenter.x < panel.GMax.x) &&
(holeCenter.y > panel.GMin.y) && (holeCenter.y < panel.GMax.y) &&
(holeCenter.z > panel.GMin.z) && (holeCenter.z < panel.GMax.z);
}
function Equals(n1, n2){
return Math.abs(n1 - n2) < 0.001;
}
function EqualsV(v1, v2) {
return Equals(v1.x, v2.x) &&
Equals(v1.y, v2.y) &&
Equals(v1.z, v2.z);
}
function CheckWithPanel(gDir, panel){
return (EqualsV(gDir, panel.NToGlobal(AxisX)) ||
EqualsV(gDir, panel.NToGlobal(Axis_X)) ||
EqualsV(gDir, panel.NToGlobal(AxisY)) ||
EqualsV(gDir, panel.NToGlobal(Axis_Y)))
}
[свернуть]
Как узнать глубину отверстия в пласти панели? (при допущении что отверстие в пласть входит перпендикулярно, хотя ... может кто знает как найти и угол вхождения в пласть(некоторые станки могут сверлить под углом)??)
|
|
|
06.07.2019, 21:33
|
#440
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,032 раз(а) в 366 сообщениях
Вес репутации: 345
|
Цитата:
Сообщение от v22884
Как узнать глубину отверстия в пласти панели? (при допущении что отверстие в пласть входит перпендикулярно, хотя ... может кто знает как найти и угол вхождения в пласть(некоторые станки могут сверлить под углом)??)
|
При допущении, что отверстие входит в пласть перпендикулярно, можно так (функция для использования в скрипте):
PHP код:
/**
* Глубина отверстия в пласти панели
* @param {*} hole Отверстие
* @param {Object3} fast Фурнитура, которой принадлежит отверстие
* @param {Panel} panel Панель
*/
function HoleFaceDepth(hole, fast, panel){
// минимум и максимум панели
var pMin = panel.GMin.z, pMax = panel.GMax.z;
// начальная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeStart = panel.ToObject(fast.ToGlobal(hole.Position)).z;
// конечная точка отверстия в ЛСК панели по оси Z (ось пласти панели)
var holeEnd = panel.ToObject(fast.ToGlobal({
x: hole.Position.x + hole.Direction.x * hole.Depth,
y: hole.Position.y + hole.Direction.y * hole.Depth,
z: hole.Position.z + hole.Direction.z * hole.Depth
})).z;
// Если начальная координата больше конечной - меняем их местами
if (holeStart > holeEnd){
var swap = holeStart;
holeStart = holeEnd;
holeEnd = swap;
}
var result = Math.min(holeEnd, pMax) - Math.max(holeStart, pMin);
return result
}
Угол между вектором направления отверстия и вектором пласти панели (последняя функция, остальные вспомогательные):
PHP код:
function VectorDot(v1, v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
function VectorLength(v) {
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
}
function VectorsAngle(v1, v2){
return Math.acos(VectorDot(v1, v2) / (VectorLength(v1) * VectorLength(v2))) * 180 / Math.PI
}
function AngleBetweenHoleDirAndPanelFace(hole, fast, panel){
var pDir = panel.NToGlobal(AxisZ);
var hDir = fast.NToGlobal(hole.Direction);
return VectorsAngle(pDir, hDir);
}
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 14:00. Часовой пояс GMT +3.
|