|
|
|
|
|
13.01.2014, 13:22
|
|
БАЗИС 9 - Скрипты
Igor_482
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
13.01.2014, 13:22
Рейтинг:
()
ВНИМАНИЕ! Правила выкладывания скриптов.
1. Если в скрипте нет ссылок на фурнитуру, фрагменты и.т.д то достаточно его упаковать в архив и выложить.
2. Если в скрипте есть ссылки на фурнитуру, фрагменты и т.д. то архив должен содержать папку с самим скриптом и всеми файлами на которые есть ссылки в тексте скрипта.
Т.к. при запуске скрипта на другом компе возникает ошибка о не возможности открыть то или иной файл и скрипт до конца не отрабатывает свой текст. Не соблюдается "чистота проверки" работы скрипта.
__________________________________________________ _______________
Интересует информация по редактору скриптов в БМ8. Существует ли справочная документация и примеры использования скриптов в БМ8. Какие возможности дает данная функция? Владеющим информацией по данному вопросу просьба поделиться ею.
Для работы скриптов от Igor_482 необходим установленный ODBC драйвер FireBird, установленные и зарегистрированные в ОС модули FBDBDialog.dll, MSDATGRD.OCX, MSCOMCTL.OCX и MSSTDFMT.DLL ( сообщение с описанием установки этих модулей в ОС, ссылка на модули и исходник "FBDBDialog.dll") а так же файл "ADODB.ini" с настройками соединения к БД в папке со скриптом.
ADODB.ini
[General]
FDBServ = t001
FBSPort = 14357
FDBFile = D:\DBBM\Библиотека\БД\BMDB09.FDB
FBCFile = C:\Windows\System32\fbclient.dll
----------------------------------------------
Переменные .ini:
FDBServ - имя ПК на котором находится сервер FireBird с используемой БД (если локально, то параметр: localhost или 127.0.0.1);
FBSPort - в настройке не нуждается (по умолчанию: 14357);
FDBFile - локальный путь к БД на сервере FireBird;
FBCFile - путь к файлу "fbclient.dll" (находится в корневой папке программы Базис).
[свернуть]
Последний раз редактировалось systland; 23.09.2016 в 11:52..
|
Просмотров: 995804
|
Пользователь сказал cпасибо:
|
|
11.03.2016, 15:24
|
#1021
|
VIP
Регистрация: 14.07.2009
Адрес: А где придётся!Злые они.....
Сообщений: 6,908
Сказал(а) спасибо: 20,983
Поблагодарили 25,949 раз(а) в 6,382 сообщениях
Вес репутации: 6096
|
Цитата:
Сообщение от fanest
Но надо чтоб этот паз шел не полностью вдоль стороны, а не доходил до конца на 14мм и начинался не сначала детали, а также с отступом на 14мм.
|
А не проще паз сразу строить как надо???
__________________
...Как искали искры в сыром бору.......
|
|
|
11.03.2016, 17:48
|
#1022
|
Пользователь
Регистрация: 26.09.2014
Сообщений: 46
Сказал(а) спасибо: 55
Поблагодарили 15 раз(а) в 5 сообщениях
Вес репутации: 124
|
Пазы на ящиках ставятся автоматом. Ящиков бывает штук8-10 и подрезать все три панели(две боковины и задняя панель) под паз оооочень долго....
|
|
|
12.03.2016, 01:10
|
#1023
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
Цитата:
Сообщение от fanest
Народ, подскажите пожалуйста есть ли такой скрипт, чтобы находил в модели ????все пазы???? и подрезал их длину с обоих сторон на определенное значение? Например, есть деталь, где есть паз под ХДФ. Но надо чтоб этот паз шел не полностью вдоль стороны, а не доходил до конца на 14мм и начинался не сначала детали, а также с отступом на 14мм. ( Тему как-то поднимал, но видимо решения не найдено)
|
тут не вижу никаких проблем:
цикл панелей
цикл пазов
если паз линия
(если линия горизонтальная по равенству координат Y) или (серьезными геометрическими формулами считать отступы по 14 с каждой стороны)
Поз1.X+14
Поз2.X-14
ВСЁ.
Для этого Базис-Скрипт и нужен, чтоб решать индивидуальный бред, т.е. задичи.
Проверь, вроде должно работать.
Скрытый текст
Model.forEachPanel(function(p) {
StartEditing(p)
cts = p.Cuts
ctsC = cts.Count
for(i=0;i<ctsC;i++)
{
tr = cts[i].Trajectory
ct = tr[0]
p1 = ct.Pos1
p2 = ct.Pos2
cc= NewContour()
c1=cc.AddCircle(p1.x, p1.y, 14)
c2 = cc.AddCircle(p2.x, p2.y, 14)
ar = geometry.Intersect(ct, c1)
newp1 = ar[0]
ar = geometry.Intersect(ct, c2)
newp2 = ar[0]
index = tr.IndexOf(ct)
tr.Extract(index)
tr.AddLine(newp1.x,newp1.y,newp2.x,newp2.y)
//tr.Subtraction(cc)
//p1.x = p1.x+14
//p2.x = p2.x-14
//system.log(p2.x)
}
//cts.Assign()
p.Build()
});
[свернуть]
Однако сколько раз нажмёшь - столько раз и подрежется, и, разумеется, пазы не только ящика, но и фасадов, скругление столешек, если используешь, и все остальные..
Цитата:
Сообщение от fanest
Тему как-то поднимал, но видимо решения не найдено
|
Неужто на такое Великое дело как скрипты не находится по часу в день? За месяц можно обрести СЕРЬЁЗНЫЙ инструмент - навык.
Добавлено через 3 минуты
Цитата:
Сообщение от fanest
Пазы на ящиках ставятся автоматом.
|
Обычно Автомат можно либо настраивать либо перепрограммировать...
Уважаемые разработчики Базис-Скрипта ответьте, пожалуйста:
Как Определяется направление Эквидистанты в команде?
Есть ли предусмотренный способ получить контур панели с подрезкой канта: ДА или НЕТ?
Есть ли возможность перебрать элементы Subfolders?
fso = NewCOMObject ("Scripting.FileSystemObject");
f = fso.GetFolder("C:\\Program Files");
system.log(f.Name)
fc = new Enumerator(f.SubFolders);
s = "";
for (;!fc.atEnd(); fc.moveNext())
{
system.log(fc.Name)
}
Последний раз редактировалось DTioutiou; 12.03.2016 в 11:39.
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
12.03.2016, 10:21
|
#1024
|
Местный
Регистрация: 30.11.2011
Сообщений: 283
Сказал(а) спасибо: 275
Поблагодарили 803 раз(а) в 179 сообщениях
Вес репутации: 358
|
1) Контур панели с подрезкой из скрипта не получить. В будущем должен быть
2) направление Эквидистанты в команде скрипта всегда справа относительно контура. чтобы построить эквидистанту с другой стороны делайте предварительно Contour.InvertDirection()
3)C Scripting.FileSystemObject не уверен, что получится перебрать из-за того, чтобы пройтись по списку SubFolders нужен специальный Enumerator, который Microsoft специально реализовала для VisualBasic и который недоступен в JavaScript.
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
16.03.2016, 09:36
|
#1025
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
Цитата:
Сообщение от fanest
Огромное спасибо!!!
|
отблагодари изучением Базис-скрипта и новыми полезными скриптами.
Есть ли предусмотренная возможность и какой алгоритм самый простой скопировать с одной панели на другую Cutts, Butts, Plastics ?
|
|
|
16.03.2016, 15:50
|
#1026
|
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Вес репутации: 367
|
Операции с контуром панели.
К развитию темы по предыдущему сообщению новый пример кода с расширенными возможностями:
Скрытый текст
PHP код:
Properties = Action.Properties; Operation = Properties.NewCombo('Действие', 'Скруглениe\nФаска\n' + 'Дуга3Т\nВолна\nПодрез\n' + 'Вырез'); Dimension = Properties.NewNumber('Размер'); Divide = Dimension.NewBool('Делить дуги'); Step = Dimension.NewNumber('Шаг'); Save = Dimension.NewBool('Запоминать указанный объект'); Clear = Dimension.NewBool('Удалять кромку объекта');
var BackUps = new Array(); var Panel = new Object(); var Bazis9 = system.apiVersion >= 90;
Properties.Load('СкруглениеУглов.xml'); Action.ShowPoints = true;
Properties.NewButton('Размер: +/-').OnClick = function() { Dimension.Value = -Dimension.Value; };
Properties.NewButton('Размер: -Ш').OnClick = function() { Dimension.Value -= Step.Value; };
Properties.NewButton('Размер: +Ш').OnClick = function() { Dimension.Value += Step.Value; };
Properties.NewButton('Отменить действие').OnClick = function() { if (BackUps.length > 0) { OldObject = BackUps.pop(); OldPanel = OldObject.Panel; StartEditing(OldPanel); OldPanel.Contour.Clear(); OldPanel.Contour.AddList(OldObject.Contour.MakeCopy()); OldPanel.Build(); }; };
if (Bazis9) Properties.NewSeparator();
Properties.NewButton('Завершить').OnClick = function() { Action.Finish(); };
function SortByArea(List) { for (var i = List.length - 1; i > 0; i--) { for (var j = 0; j < i; j++) { if (geometry.Area(List[j]) < geometry.Area(List[j + 1])) { var Value = List[j]; List[j] = List[j + 1]; List[j + 1] = Value; }; }; }; return List; };
function FindClosedContours(Original) { var Copy = NewContour(); var Result = new Array(); Copy.AddList(Original.MakeCopy()); while (true) { ClosedContour = NewContour(); if (Copy.FindContour(ClosedContour, true)) { Result.push(ClosedContour) } else { break; }; }; return SortByArea(Result); };
function EqualsArea(A, B) { if (geometry.Area(A) != geometry.Area(B)) return false; return true };
function ObjectsLength(List) { var Result = new Number(); for (var i = 0; i < List.Count; i++) { Result += List[i].ObjLength(); }; return parseFloat(Result.toFixed(10)); };
function EqualsLength(A, B) { if (ObjectsLength(A) != ObjectsLength(B)) return false; return true; };
Action.OnFinish = function() { Properties.Save('СкруглениеУглов.xml'); Model.UnHighlightAll(); };
Action.OnMove = function() { Obj = Action.Get3DObject(); if (Obj instanceof TFurnPanel) { Panel = Obj.AsPanel; if (!Panel.Highlighted) { Model.UnHighlightAll(); Panel.Highlighted = true; }; } else if (!Save.Value) { Panel = new Object(); Model.UnHighlightAll(); }; };
Action.OnClick = function() { if (Panel.AsPanel != undefined) { StartEditing(Panel); Contour = Panel.Contour; Contour.OrderContours(true); if (Contour.IsClockOtherWise()) Contour.InvertDirection(); OldContour = NewContour(); OldContour.AddList(Contour.MakeCopy()); if (Dimension.Value != 0) { Point = Contour.ClosestPoint(Panel.ToObject(Action.Pos3)); switch (Operation.Value) { case 'Скруглениe': Contour.Rounding(Point.x, Point.y, Dimension.Value); if (EqualsLength(Contour, OldContour)) { Contour.Rounding(Point.x, Point.y, -Dimension.Value); }; break; case 'Фаска': Arc = Contour.Rounding(Point.x, Point.y, Dimension.Value); if (EqualsLength(Contour, OldContour)) { Arc = Contour.Rounding(Point.x, Point.y, -Dimension.Value); }; if (!EqualsLength(Contour, OldContour)) { Contour.AddLine(Arc.Pos1.x, Arc.Pos1.y, Arc.Pos2.x, Arc.Pos2.y); Contour.Delete(Arc); }; break; case 'Дуга3Т': Line = Contour.Find(Point.x, Point.y); if (Line.IsLine()) { Offset = NewPoint(0 * Line.NormDir().x - Dimension.Value * Line.NormDir().y, Dimension.Value * Line.NormDir().x + 0 * Line.NormDir().y); Center = NewPoint(Line.LineCenter().x - Offset.x, Line.LineCenter().y - Offset.y); Arc3 = Contour.AddArc3(Line.Pos1, Center, Line.Pos2); if (Divide.Value) { Contour.AddArc(Line.Pos1, Center, Arc3.Center, Dimension.Value > 0); Contour.AddArc(Center, Line.Pos2, Arc3.Center, Dimension.Value > 0); Contour.Delete(Arc3); }; Contour.Delete(Line); }; break; case 'Волна': Line = Contour.Find(Point.x, Point.y); if (Line.IsLine()) { Line01 = Contour.AddLine(Line.Pos1.x, Line.Pos1.y, Line.LineCenter().x, Line.LineCenter().y); Line02 = Contour.AddLine(Line.LineCenter().x, Line.LineCenter().y, Line.Pos2.x, Line.Pos2.y); Contour.Delete(Line); Offset = NewPoint(0 * Line01.NormDir().x - Dimension.Value * Line01.NormDir().y, Dimension.Value * Line01.NormDir().x + 0 * Line01.NormDir().y); Center = NewPoint(Line01.LineCenter().x - Offset.x, Line01.LineCenter().y - Offset.y); Arc3 = Contour.AddArc3(Line01.Pos1, Center, Line01.Pos2); if (Divide.Value) { Contour.AddArc(Line01.Pos1, Center, Arc3.Center, Dimension.Value > 0); Contour.AddArc(Center, Line01.Pos2, Arc3.Center, Dimension.Value > 0); Contour.Delete(Arc3); }; Contour.Delete(Line01); Offset = NewPoint( 0 * Line02.NormDir().x - -Dimension.Value * Line02.NormDir().y, -Dimension.Value * Line02.NormDir().x + 0 * Line02.NormDir().y); Center = NewPoint(Line02.LineCenter().x - Offset.x, Line02.LineCenter().y - Offset.y); Arc3 = Contour.AddArc3(Line02.Pos1, Center, Line02.Pos2); if (Divide.Value) { Contour.AddArc(Line02.Pos1, Center, Arc3.Center, -Dimension.Value > 0); Contour.AddArc(Center, Line02.Pos2, Arc3.Center, -Dimension.Value > 0); Contour.Delete(Arc3); }; Contour.Delete(Line02); }; break; case 'Подрез': if (Bazis9) { var Contours = FindClosedContours(Contour); Contour.Clear(); for (var i = 0; i < Contours.length; i++) { if (Contours[i].IsClockOtherWise()) Contours[i].InvertDirection(); var Equidistant = NewContour(); switch (true) { case i == 0: Equidistant.AddEquidistant(Contours[i], Dimension.Value, false, false); break; case i > 0: Equidistant.AddEquidistant(Contours[i], -Dimension.Value, false, false); break; }; Contour.AddList(Equidistant.MakeCopy()); }; } else { alert('БМ8 не имеет API функции построения эквидистанты.'); }; break; case 'Вырез': if (Bazis9) { var Contours = FindClosedContours(Contour); Contour.Clear(); Contour.AddList(Contours[0].MakeCopy()); if (Contour.IsClockOtherWise()) Contour.InvertDirection(); var Equidistant = NewContour(); Equidistant.AddEquidistant(Contour, Dimension.Value, false, false); Contour.AddList(Equidistant.MakeCopy()); } else { alert('БМ8 не имеет API функции построения эквидистанты.'); }; break; }; Contour.OrderContours(true); } else { alert('Параметр "Размер" должен отличаться от нуля!'); }; for (var i = 0; i < Contour.Count; i++) { if (Contour[i].IsArc()) { if (parseFloat(Contour[i].ObjLength().toFixed(12)) == 0 || parseFloat(Contour[i].ObjLength().toFixed(12)) == parseFloat((Contour[i].ArcRadius() * 2 * Math.PI).toFixed(12))) { Contour.Delete(Contour[i]); Contour.OrderContours(true); system.log('Найдена дуга длинной 2PI*R!'); }; }; if (Contour[i].IsLine()) { if (parseFloat(Contour[i].ObjLength().toFixed(12)) == 0) { Contour.Delete(Contour[i]); Contour.OrderContours(true); system.log('Найден отрезок нулевой длинны!'); }; }; }; if (!Contour.IsClosedContour()) { Contour.Clear(); Contour.AddList(OldContour.MakeCopy()); Contour.OrderContours(true); system.log('Контур не замкнут!'); }; if (!EqualsLength(Contour, OldContour)) { var BackUp = { Panel: Panel, Contour: OldContour }; BackUps.push(BackUp); if (Panel.Butts.Count > 0 && Clear.Value) Panel.Butts.Clear(); }; Panel.Build(); }; };
Action.Continue();
[свернуть]
Так же вопрос к знатокам и специалистам.
В каком порядке выводится результат поиска замкнутых контуров функцией "Contour.FindContour(ClosedContour, true)" c учетом площади и по её убыванию (или возрастанию) или нет?
В скрипте присутствует функция сравнение контура до изменения с этим же контуром после его изменения, сравнение происходит по его площади.
Есть ли другой более простой способ (за исключением варианта "Contour.ObjLength()") сравнения двух контуров с учетом того, что он может состоять из нескольких замкнутых контуров?
Последний раз редактировалось Igor_482; 17.03.2016 в 10:16.
|
|
|
7 пользователя(ей) сказали cпасибо:
|
|
18.03.2016, 22:45
|
#1027
|
Местный
Регистрация: 30.11.2011
Сообщений: 283
Сказал(а) спасибо: 275
Поблагодарили 803 раз(а) в 179 сообщениях
Вес репутации: 358
|
Цитата:
Сообщение от v22884
Есть ли предусмотренная возможность и какой алгоритм самый простой скопировать с одной панели на другую Cutts, Butts, Plastics ?
|
Попробуйте newPanel.Assign(oldPanel); Должно скопироваться всё, включая контур и положение
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
19.03.2016, 02:48
|
#1028
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
Цитата:
Сообщение от Briz
Должно скопироваться всё, включая контур и положение
|
Спасибо. Работает!
А Без Контура и Положения?
Присвоить прошлые?
Скрытый текст
p = AddPanel(100, 200)
cc = p.Cuts.Add()
cc.Contour.AddCircle(0, 0, 10)
cc.Trajectory.AddLine(0, 0, 50, 50)
b = p.Butts.Add()
b.ElemIndex = 2;
b.Thickness = 3;
b.Material = 'Кант Ш-обр Вишня';
b.Sign = 'Ш-Вишня';
b.ClipPanel = true
p2= AddPanel(30, 20)
p2.Translate(NewVector(100, 80, 50))
p2c = p2.Contour.MakeCopy()
p2Pos = p2.Position
p2.Assign(p)
p2.Contour.Clear()
p2.Contour.Addition(p2c) //а можно оказывается вместо этих двух строк и так: p2.Contour.Assign(p2c)
p2.Position= p2Pos
[свернуть]
да работает! Спасибо!
Я, пожалуй, повторюсь, однако ОЧ хотелось бы ВСЕ функции в справке.
Оказывается Cutts, Butts и Plastics можно по отдельности копировать. В Assign() параметр тож должен быть Cutts, Butts и Plastics, другой панели например.
Когда все функции будут в справке?
Не верю что сложно записать какой параметр должен быть в функции.
Хотябы запишите все типы параметров, на каждую функцию, которые должны быть, дальше мы и без справки разберёмся.
по приципу цикла с key.
Может просто в этом коде с key добавить таки возможность показывать Типы параметров?
Как взять пути из настроек, например путь Фрагментов?
Вроде бы не плохой вариант запуска VBS:
Скрытый текст
vbs = Action.Properties.Options.CurrentPath + '2.vbs'
vbsText = 'WScript.Echo 2'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
[свернуть]
буду использовать для работы с файловой системой.
Вариант Удаления Файла:
Скрытый текст
file = Action.Properties.Options.CurrentPath + 'Файл'
system.writeTextFile(file, ' ')
if(system.fileExists(file)) {
system.log('Файл есть')
deletefile(file)
}
function deletefile(file)
{
vbsText = 'Dim fso\r\n Set fso = CreateObject("Scripting.FileSystemObject")\r\n fso.DeleteFile("'+file+'")'
vbs = Action.Properties.Options.CurrentPath + 'delFile.vbs'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
while(system.fileExists(file)) {
system.log('жду удаления файла')
system.sleep(500);
}
system.log('Файл удалён!!!')
}
[свернуть]
и всё таки будет ли когда работать в базис скрипте команды КОМ объектов такие как Run c параметрами и DeleteFile и цикл SubFolders ?
Добавлено через 7 минут
Вариант Чтения Списка Файлов в Каталоге:
Скрытый текст
folder = '\\\\192.168.137.5\\!заказы\\__________ПО\\Bazis8\\Фрагменты\\Фрезы'
vbs = Action.Properties.Options.CurrentPath + 'fl.vbs'
fileListFile = Action.Properties.Options.CurrentPath + 'fl'
deletefile(fileListFile)
vbsText = 'Option Explicit\r\nOn Error Resume Next\r\nDim FolderPath \r\nDim objFSO\r\nDim objFolder\r\nDim colFiles\r\nDim objFile\r\nDim s\r\nDim f1\r\n \r\nFolderPath = "'+ folder +'"\r\nSet objFSO = CreateObject("Scripting.FileSystemObject")\r\nSet objFolder = objFSO.GetFolder(FolderPath)\r\nSet colFiles = objFolder.Files\r\n s = "Name Size DateCreated DateLastModified Type"& vbCrLf\r\nFor Each objFile in colFiles\r\n \r\n f1 = objFile.Name & VbTab & objFile.Size & VbTab & objFile.DateCreated & VbTab & objFile.DateLastModified & VbTab & objFile.Type\r\n s = s & f1 \r\n \r\n s = s & vbCrLf\r\n \r\nNext\r\n\r\nWriteText(s)\r\n\r\nSub WriteText(Text)\r\n Dim fso, tf\r\n Set fso = CreateObject("Scripting.FileSystemObject")\r\n Set tf = fso.CreateTextFile("'+fileListFile +'", True)\r\n tf.Write (Text) \r\n tf.Close\r\nEnd Sub'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
while (!system.fileExists(fileListFile)) {
system.sleep(500);
}
fileListText = system.readTextFile(fileListFile);
stroki = fileListText.split('\r\n')
for(i=1;i< stroki.length-1;i++)
{
str = stroki[i].split('\t')
fname = str[0]
fSize = str[1]
fDateCreated = str[2]
fDateLastModified = str[3]
fType = str[4]
log = fname + ' -- ' +fSize + ' -- '+ fDateCreated + ' -- '+ fDateLastModified + ' -- '+ fType
system.log(log)
}
function deletefile(file)
{
vbsText = 'Dim fso\r\n Set fso = CreateObject("Scripting.FileSystemObject")\r\n fso.DeleteFile("'+file+'")'
vbs = Action.Properties.Options.CurrentPath + 'delFile.vbs'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
while(system.fileExists(file)) {
system.log('жду удаления файла')
system.sleep(500);
}
system.log('Файл удалён!!!')
}
[свернуть]
Последний раз редактировалось DTioutiou; 20.03.2016 в 11:39.
|
|
|
3 пользователя(ей) сказали cпасибо:
|
|
21.03.2016, 11:48
|
#1029
|
Местный
Регистрация: 17.04.2014
Адрес: д.Сибирцево, ателье-уют.рф
Сообщений: 454
Сказал(а) спасибо: 242
Поблагодарили 1,094 раз(а) в 210 сообщениях
Вес репутации: 386
|
askFileName - очень хороший метод.
askFolderName - надо добавить. c хорошим окном(как для файла), а не как для сохранения dxf из библиотеки. (пожалуйста, поменяйте и для для сохранения dxf из библиотеки окно на удобное)
vbs 5 часов искал не нашёл хорошего окна для выбора папки.
ктонить богат решениями?
Вариант Чтения Списка Файлов в Каталоге со всеми свойствами:
Скрытый текст
folder = '\\\\192.168.137.5\\!заказы\\__________ПО\\Bazis8\\Фрагменты\\Фрезы'
readFolder(folder)
function readFolder(folder)
{
vbs = Action.Properties.Options.CurrentPath + 'fl.vbs'
fileListFile = Action.Properties.Options.CurrentPath + 'fl'
deletefile(fileListFile)
vbsText = 'Option Explicit\r\nOn Error Resume Next\r\nDim FolderPath \r\nDim objFSO\r\nDim objFolder\r\nDim colFiles\r\nDim objFile\r\nDim s\r\nDim f1\r\n \r\nFolderPath = "'+folder+'"\r\nSet objFSO = CreateObject("Scripting.FileSystemObject")\r\nSet objFolder = objFSO.GetFolder(FolderPath)\r\nSet colFiles = objFolder.Files\r\n s = "Name Size DateCreated DateLastModified Type Attributes DateLastAccessed Drive ParentFolder Path ShortName ShortPath"& vbCrLf\r\nFor Each objFile in colFiles\r\n \r\n f1 = objFile.Name & VbTab & objFile.Size & VbTab & objFile.DateCreated & VbTab & objFile.DateLastModified & VbTab & objFile.Type & VbTab & objFile.Attributes & VbTab & objFile.DateLastAccessed & VbTab & objFile.Drive & VbTab & objFile.ParentFolder & VbTab & objFile.Path & VbTab & objFile.ShortName & VbTab & objFile.ShortPath\r\n s = s & f1 \r\n '+
' \r\n s = s & vbCrLf\r\n \r\nNext\r\n\r\nWriteText(s)\r\n\r\nSub WriteText(Text)\r\n Dim fso, tf\r\n Set fso = CreateObject("Scripting.FileSystemObject")\r\n Set tf = fso.CreateTextFile("'+fileListFile+'", True)\r\n tf.Write (Text) \r\n tf.Close\r\nEnd Sub'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
while (!system.fileExists(fileListFile)) {
system.sleep(500);
}
fileListText = system.readTextFile(fileListFile);
stroki = fileListText.split('\r\n')
ar = []
for(i=1;i< stroki.length-1;i++)
{
str = stroki[i].split('\t')
f = {}
f.Name = str[0]
f.Size = str[1]
f.DateCreated = new Date(str[2].replace(/(\d+).(\d+).(\d+)/, '$3/$2/$1'));
f.DateLastModified = new Date(str[3].replace(/(\d+).(\d+).(\d+)/, '$3/$2/$1'))
f.Type = str[4]
f.Attributes = str[5]
/* Attributes
Constant Value Description
Normal 0 Normal file. No attributes are set.
ReadOnly 1 Read-only file. Attribute is read/write.
Hidden 2 Hidden file. Attribute is read/write.
System 4 System file. Attribute is read/write.
Volume 8 Disk drive volume label. Attribute is read-only.
Directory 16 Folder or directory. Attribute is read-only.
Archive 32 File has changed since last backup. Attribute is read/write.
Alias 64 Link or shortcut. Attribute is read-only.
Compressed 128 Compressed file. Attribute is read-only.
https://msdn.microsoft.com/en-us/lib...=vs.60%29.aspx
*/
f.DateLastAccessed = new Date(str[6].replace(/(\d+).(\d+).(\d+)/, '$3/$2/$1'));
f.Drive = str[7]
f.ParentFolder = str[8]
f.Path = str[9]
f.ShortName = str[10]
f.ShortPath = str[11]
ar.push(f)
log = f.Name + ' -- ' +f.Size + ' -- '+ f.DateCreated + ' -- '+ f.DateLastModified + ' -- '+ f.Type + ' -- '+ f.Attributes+ ' -- '+ f.DateLastAccessed+ ' -- '+ f.Drive+ ' -- '+ f.ParentFolder+ ' -- '+ f.Path+ ' -- '+ f.ShortName+ ' -- '+ f.ShortPath
system.log(log)
}
system.log(ar.length)
return ar
}
function deletefile(file)
{
vbsText = 'Dim fso\r\n Set fso = CreateObject("Scripting.FileSystemObject")\r\n fso.DeleteFile("'+file+'")'
vbs = Action.Properties.Options.CurrentPath + 'delFile.vbs'
system.writeTextFile(vbs, vbsText)
oShell = NewCOMObject ("WScript.Shell")
oShell.run(vbs)
while(system.fileExists(file)) {
system.log('жду удаления файла')
system.sleep(500);
}
system.log('Файл удалён!!!')
}
[свернуть]
Последний раз редактировалось DTioutiou; 21.03.2016 в 15:51.
|
|
|
22.03.2016, 14:13
|
#1030
|
VIP
Регистрация: 03.09.2008
Сообщений: 174
Сказал(а) спасибо: 34
Поблагодарили 794 раз(а) в 113 сообщениях
Вес репутации: 367
|
Цитата:
Сообщение от Briz
чтобы пройтись по списку SubFolders нужен специальный Enumerator
|
Надеялся решение найдется следующим образом:
Скрытый текст
PHP код:
ScriptControl = NewCOMObject('MSScriptControl.ScriptControl');
ScriptControl.Language = 'JScript';
try {
ScriptControl.AddCode(
'function GetFileList(Path) { \n' +
'var List = new String(); \n' +
'var FSO = new ActiveXObject("Scripting.FileSystemObject");\n' +
'var Folder = FSO.GetFolder(Path); \n' +
'FilesEnum = new Enumerator(Folder.files); \n' +
'for (; !FilesEnum.atEnd(); FilesEnum.moveNext()) { \n' +
'List += FilesEnum.item() + \n; \n' +
'}; \n' +
'return List; \n' +
'}; \n'
);
system.log(ScriptControl.Run('GetFileList', 'C:\\'));
} catch(Error) {
system.log(Error.message);
};
[свернуть]
но код выполняется до строки "ScriptControl.AddCode()", далее сообщается об ошибке: "...the script engine has not been initialized to a valid language...".
При написании этого же кода в Excel
Скрытый текст
PHP код:
Sub test()
Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
ScriptControl.Language = "JScript"
ScriptControl.AddCode ( _
"function GetFileList(Path) { " + _
"var List = new String(); " + _
"var FSO = new ActiveXObject('Scripting.FileSystemObject');" + _
"var Folder = FSO.GetFolder(Path); " + _
"FilesEnum = new Enumerator(Folder.files); " + _
"for (; !FilesEnum.atEnd(); FilesEnum.moveNext()) { " + _
" List += FilesEnum.item() + '\n'; " + _
"}; " + _
"return List; " + _
"}; " _
)
MsgBox ScriptControl.Run("GetFileList", "C:\")
Set ScriptControl = Nothing
End Sub
[свернуть]
все прекрасно работает.
Просьба пояснить в чем заключается проблема в данном случае.
|
|
|
Пользователь сказал cпасибо:
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 13:19. Часовой пояс GMT +3.
|