Вопросы по МАКРОЯЗЫКу.

Модераторы: Лабутин Сергей Евгеньевич, Алек(андр

Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 28 июн 2012 17:04

В этой теме предлагаю задавать вопросы по программированию на макроязыке, командам и функциям.

Первый вопрос.
Создаю блок
block last 1 done 0,0,0 "ds";
Как определить, есть ли уже блок с таким именем?
------
Что-то с блоками совсем беда. Присвоить атрибут attrobj attach, а прочитать нельзя, никакие функции (getattr,IsValue,IsAssign) не работают.
Это так надо?
-----
Похоже, так надо. WriteScratch тоже ни хера не работает.
Для чего делать вещи, которые не работают?
Или работают только функции, написанные персонально для Драгункина? Как сказал Роман Николаевич:
править инструкцию из-за функции, которая используется только в одном макро и делалась специально для него - нерационально

И в самом деле, зачем?
-----
С уважением, особо доброжелательный участник.
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 04 июл 2012 10:00

Я блоками не пользовался. Мне группы хватает, но судя по мануалу
LOGICA L W r i t e S c r a t c h ( INT < I n d e x> , STRING < A t t r Na m e > , V A RIA NT < h o l d e r > )
В качестве VARIANT надо указывать имя блока. Это должен быть тип string.
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 04 июл 2012 13:52

Алек(андр писал(а):Я блоками не пользовался. Мне группы хватает, но судя по мануалу
LOGICA L W r i t e S c r a t c h ( INT < I n d e x> , STRING < A t t r Na m e > , V A RIA NT < h o l d e r > )
В качестве VARIANT надо указывать имя блока. Это должен быть тип string.

Не читает, возвращает 0. Опять недоделали. Я почему хочу блоками пользоваться: если делать через объект на погашенном слое (сейчас у меня так сделано), то, чтобы прочитать атрибут, надо слой сначала включить, а потом погасить, что не очень красиво и долго, особенно в цветном режиме.
Вот ещё вопрос, повторно:
есть замечательные системные переменные.
Нет ли среди них переменной отвечающей за путь для загрузки/сохранения файла?
А то приходится вот так извращаться, чтобы открыть папку проектов:
res=SetSysVar(4,Protopath-6+"\\Projects\\")
// open
append : : ;
save all sysvar(4) [ overwrite ]
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 05 июл 2012 11:07

Рыжий Пёс писал(а):
Алек(андр писал(а):Я блоками не пользовался. Мне группы хватает, но судя по мануалу
LOGICA L W r i t e S c r a t c h ( INT < I n d e x> , STRING < A t t r Na m e > , V A RIA NT < h o l d e r > )
В качестве VARIANT надо указывать имя блока. Это должен быть тип string.

Не читает, возвращает 0. Опять недоделали. Я почему хочу блоками пользоваться: если делать через объект на погашенном слое (сейчас у меня так сделано), то, чтобы прочитать атрибут, надо слой сначала включить, а потом погасить, что не очень красиво и долго, особенно в цветном режиме.
Вот ещё вопрос, повторно:
есть замечательные системные переменные.
Нет ли среди них переменной отвечающей за путь для загрузки/сохранения файла?
А то приходится вот так извращаться, чтобы открыть папку проектов:
res=SetSysVar(4,Protopath-6+"\\Projects\\")
// open
append : : ;
save all sysvar(4) [ overwrite ]

Надо бы конечно в 7-ке это проверить с блоками.
Слой на самом деле включать не надо если не пользоваться select. Все объекты на всех уровнях это sysvar(62), а чтение атрибута getattr работает по ссылке с объектами в любом состоянии. Проверил, у меня работает. погасил полку и запросил у нее значения атрибутов "unitpos" и "Furntype" вернулись правильные значения. Просто вы работаете по именам блоков, а я по указателям на объект.

Ваш код (res=SetSysVar(4,...) я не понял. Что надо ? у вас файлы проектов в PROTO лежат? у вас путь получается , что папка проектов лежит рядом с PROTO.
А что sysvar(4) возвращает? Он и должен вернуть ..../PROJECTS/

Есть такая штука метапапки и соответственно метапути. Я не помню когда они появились. Работает это так

S TRING M P a t h Ex p a n d ( S TRING < a p p > )
Функция возвр ащае т полный путь, заданный ме тапапкой < a p p > . Ме тапапка должна быть
заключе на в тр е угольные скобки (<>). Е сли ме тапапки < a p p > не т, то функция ве р не т стр оку бе з
изме не ний.
Пр име р :
mp="<K3Files>"
=mpathexpand(mp)
"C: \ \Program Files\ \Geos\ \K3-Мебель\ \Dat a\ \ pkm\ \K3Files"
mp="<Proto>\\kitchen\\"
=mpathexpand(mp)
"C: \ \Program Files\ \Geos\ \K3-Мебель\ \Dat a\ \ pkm\ \Prot o\ \ kit chen\ \
"

А чем SysVar(4) или sysvar(2) не устраивает?
Вложения
05.07.png
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 05 июл 2012 12:36

Алек(андр писал(а):А чем SysVar(4) или sysvar(2) не устраивает?

Объясняю задачу.
Запуск К3, чистый лист. Требуется загрузить через макрос сохранённый проект.
При загрузке из атрибута определённого объекта считываются данные. Выбирать все объекты сцены, а потом искать нужный перебором - не наш метод. Поэтому selbyattr "IsAssign(\"KitchenDef\")" all done. Это к вопросу гасить и включать.
Теперь по sysvar. Как известно, после запуска К3 они все указывают папку Bin. Если выполнить open, то пользователю придётся лезть через все папки до PROJECTS, а это нехорошо. Значит надо установить "путь к папке с проектами" в Protopath-6+"\\Projects\\", но такой системной переменной, кажется, нет. Зато есть "путь к последнему добавленному файлу", чем я и пользуюсь.
P.S. Хотелось бы уточнить по хеш-кодам. Насколько они надёжны относительно кодирования протообъектов? какой алгоритм поосветуете (желательно быстрый)? если кодировать кухонный каталог на основе параметров прототипа, велика ли вероятность повтора? или есть другие способы. На данный момент я пишу параметры в строку, но получаются строки больше 255 символов.
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 05 июл 2012 12:57

Рыжий Пёс писал(а):
Алек(андр писал(а):А чем SysVar(4) или sysvar(2) не устраивает?

Объясняю задачу.
Запуск К3, чистый лист. Требуется загрузить через макрос сохранённый проект.
При загрузке из атрибута определённого объекта считываются данные. Выбирать все объекты сцены, а потом искать нужный перебором - не наш метод. Поэтому selbyattr "IsAssign(\"KitchenDef\")" all done. Это к вопросу гасить и включать.
Теперь по sysvar. Как известно, после запуска К3 они все указывают папку Bin. Если выполнить open, то пользователю придётся лезть через все папки до PROJECTS, а это нехорошо. Значит надо установить "путь к папке с проектами" в Protopath-6+"\\Projects\\", но такой системной переменной, кажется, нет. Зато есть "путь к последнему добавленному файлу", чем я и пользуюсь.

Что значит не ваш метод? Если метод в стопитцот раз быстрее вашего, то значит что то с вашими выбранными методами не то.

Вот метод который заполнит массив ссылками на все объекты с KitchenDef за нуль секунд в отличии от селбайаттра
Код: Выделить всё
nn=sysvar(62)
defarr arr[nn] arr1[nn];
m=scanscene(arr);
g_nObjUP=0
i=0
loop:
if i<=m {
   i=i+1
    if IsAssign("KitchenDef ",arr[i]) {
      g_nObjUP=g_nObjUP+1;
      arr1[g_nObjUP]=arr[i]
       
    }
   
    goto loop;
}

arr1 в элементах с 1-го по g_nObjUP будет заполнен ссылками объекты c атрибутом KitchenDef причем в отличии от selbyattr "IsAssign(\"KitchenDef\")" all done будут выбраны объекты на всех уровнях даже если у родителя есть такой же атрибут.

На счет
Как известно, после запуска К3 они все указывают папку Bin
было такое при простом старте mebel.exe. Наверное надо стартовать малость по другому.

...\Bin\mebel.exe -m: имя макроса

когда стартуем из под базы именно так к3 стартует включая 6-е версии создается \temp\temp.mac, а там формируется строка открытия проекта
вызываются макросы из Proto типа open_sh.mac или open_shs.mac

то бишь ярлыку который стартует задачу надо эту строчку прописать

вот как стартует задачу аксесс
Код: Выделить всё
ChDir GetCustPrjPath()
  ChDrive GetCustPrjPath()
  idk = Shell(S, vbMaximizedFocus)


я прописал в ярлыке

в вызове C:\K3-Мебель......64\Bin\Mebel.exe -m:C:\K3-Мебель-......64\Data\PKM\PROTO\new_sh.mac

рабочую папку назначил C:\K3-Мебель-....64\Data\PKM\PROJECTS\

sysvar(4) возвращает C:\K3-Мебель-....64\Data\PKM\PROJECTS\
Вложения
05.07б.png
05.07ф.png
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 05 июл 2012 15:01

Рыжий Пёс писал(а):P.S. Хотелось бы уточнить по хеш-кодам. Насколько они надёжны относительно кодирования протообъектов? какой алгоритм поосветуете (желательно быстрый)? если кодировать кухонный каталог на основе параметров прототипа, велика ли вероятность повтора? или есть другие способы. На данный момент я пишу параметры в строку, но получаются строки больше 255 символов.

важно что бы последовательность свойств была однозначна.
можно кодировать не только строку, но и любой файл.
Код: Выделить всё
hashlib.md5(file(fname, 'r').read()).digest()

в этом случае файл читается полностью в память, можно и рухнуть при очень больших размерах
тогда так безопаснее
Код: Выделить всё
def md5sum(filename):
    md5 = hashlib.md5()
    with open(filename,'rb') as f:
        for chunk in iter(lambda: f.read(128*md5.block_size), b''):
             md5.update(chunk)
    return md5.hexdigest()


т.е вы можете валить свойства строками в файл и уже получать хеш этого файла.
на счет надежности алгоритма MD5 почитайте в интернете. Можно начать отсюда это документация
на счет скорости это наносекунды.
то что вы называете повтором именуется коллизиями. лично я не сталкивался ни разу, но теоретически они возможны.
2^128 это порядка 10^38 различных хешей.

В 2005 году Ван Сяоюнь и Юй Хунбо из университета Шаньдуна в Китае опубликовали алгоритм, который может найти две различные последовательности в 128 байт, которые дают одинаковый MD5-хеш.
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 10 июл 2012 20:42

Александр, спасибо за подсказку про selbyattr, буду постепенно от него отказываться.
Алек(андр писал(а):На счет
Как известно, после запуска К3 они все указывают папку Bin
было такое при простом старте mebel.exe. Наверное надо стартовать малость по другому.

...\Bin\mebel.exe -m: имя макроса

когда стартуем из под базы именно так к3 стартует включая 6-е версии создается \temp\temp.mac, а там формируется строка открытия проекта
вызываются макросы из Proto типа open_sh.mac или open_shs.mac

то бишь ярлыку который стартует задачу надо эту строчку прописать

Если прописать путь для рабочей папки К3 в свойствах файла, то придется или создавать программу установки, а я это делать не умею и учиться времени нет, или каждый раз справлять вручную, что тоже неправильно.
С Питоном пока разбираться тоже нет времени, надо написать программку для вычисления хеша самому, потому и спросил насчёт простого алгоритма.
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 11 июл 2012 12:07

Рыжий Пёс писал(а):Александр, спасибо за подсказку..... а я это делать не умею и учиться времени нет, или каждый раз справлять вручную, что тоже неправильно.....

ролик с примером создания setup это Innosetup созданный жутко неграмотным пользователем. пример того , что все настолько просто, что и учиться не надо. Если в поиске набрать innosetup вылезет куча полезного материала. все создается на раз-два.

это сайт программы . InnoIDE is released as a "free to use" product, but as with all free software, то бишь можно не платить
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение konstra » 12 июл 2012 15:22

В инструкциях не нашол как открыть файл из макроса. Возможно ли?Имеется база данных,лежит в Proto. Её надо открыть прямо из К3.
Аватара пользователя
konstra
 
Сообщения: 199
Зарегистрирован: 12 дек 2011 09:52

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 12 июл 2012 19:06

konstra писал(а):В инструкциях не нашол как открыть файл из макроса. Возможно ли?Имеется база данных,лежит в Proto. Её надо открыть прямо из К3.


Команда Execute

37.4 Вызов внешних приложений и задач
execute, wai t
e x e c u t e [ { m a x i m i z e | m i n i m i z e | r e s t o r e } wa i t [ No DC | P r o m p t < P r o m p t > ] ] {
< F i l e Na m e A n d P a r a m s > | b o t h < F i l e Na m e > , < P a r a m s > }
Команда запускае т на выполне ние вне шне е пр иложе ние с полным име не м < F i l e Na m e >
и стр окой пе р е давае мых пар аме тр ов < P a r a m s > . Е сли ключ b o t h не указан, полное имя
пр иложе ние и пар аме тр ы задаются одной стр окой < F i l e Na m e A n d P a r a m s > .
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 13 июл 2012 08:28

Руководство по макроязыку K3MACRO_64.pdf обычно лежит в папке Manual или можно скачать с сайта
Пример использования execute. Запуск MS ACCESS и базы folder\\FabricCustom.mdb
Код: Выделить всё
ProjPath=GetFilePath(SysVar(2));
ProjName=ProtoPath+"folder\\имя файла.mdb"  ;
FileName="AccessPath.txt";
AccessPath=GetStr(ProtoPath+FileName,1);
MDBrun=AccessPath+"MSACCESS.EXE "; // Путь к приложению Access
MDBfile=ProjName;
execute wait MDBrun+MDBfile;

путь к приложению MSACCESS.EXE у меня прописан в файле c:\K3-Мебель....\Data\PKM\Proto\AccessPath.txt
там единственная строка
Код: Выделить всё
D:\Microsoft Office\OFFICE11\

дело в том , что я проверяю наличие аксесса и путь к нему на каждой клиентской машине, а он лежит у всех по разному.
Делаю я это средствами VBScript, но это уже другая история и может показаться избыточно сложным. Поэтому просто пропишите ручками строку в файл AccessPath.txt, где у вас лежит Аксесс.
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 19 июл 2012 15:22

Надо добавить объект в группу, вложенную в другую группу. Можно ли это сделать, не разбирая группы верхнего уровня? Пока получается добавить объект только на самый верхний уровень.
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Алек(андр » 22 июл 2012 21:17

Рыжий Пёс писал(а):Надо добавить объект в группу, вложенную в другую группу. Можно ли это сделать, не разбирая группы верхнего уровня? Пока получается добавить объект только на самый верхний уровень.

Можно извлечь и можно положить на место.
Для того что бы положить в группу "на глубине" надо что бы был указатель на эту группу ту которая на глубине. И дальше обычный add с ключом partly

11.2 Добавление объектов в группу
add
a d d [ p a r t l y ] < Ob j e c t > < Ob j e c t s >
Команда добавляе т объе кты < Ob j e c t s > в гр уппу < Ob j e c t > .
11.3 Извлечение объектов из группы
extract
e x t r a c t [ p a r t l y ] < Ob j e c t > < Ob j e c t s >
Команда извле кае т объе кты < Ob j e c t s > из гр уппы < Ob j e c t > .
Аватара пользователя
Алек(андр
 
Сообщения: 1166
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: Вопросы по МАКРОЯЗЫКу.

Сообщение Рыжий Пёс » 23 июл 2012 01:59

Спасибо за подсказку, всё дело в волшебном слове partly.
Сейчас у меня более принципиальный вопрос. Возникла необходимость воспользоваться Scratch атрибутами. Можно ли их использовать для вложенных объектов (например, ящиков?). Кажется, нельзя. Придумал, пока, только такой способ: в макросе прототипа присваивать номера всем построенном в нём объектам, при помощи глобальной переменной, а в скрече делать ссылку на этот номер.
Аватара пользователя
Рыжий Пёс
 
Сообщения: 338
Зарегистрирован: 06 фев 2010 00:11

След.

Вернуться в К3-Мебель. Программа для производства и продажи мебели.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron