Решение довольно простое. Все библ. элементы надо запаролить. Также все элементы должны содержать в скрипте параметров HIDEPARAMETERS ALL (и дальше список тех, которые все-таки показывать - например A, B, ZZYZX). Потом у каждого объекта должен быть UI (интерфейс). А также некий макрос, который проверяет номер лицензии из списка - скажем у компании 10 лицензий - все десять номеров записываются в массив переменной. Перед выполнением скрипта интерфейса программа обращается в макрос - там скрипт сопоставляет эти номера и выдает 1 или 0 и возвращает значение в основной объект. Если ноль - интерфейс блокируется и пишется что-то вроде "это не лицензионная версия библиотеки, модификация элемента заблокирована". Можно также заблокировать движущие точки (editable hotspots).
А насчет того, что это не будет работать на пиратской версии ArchiCAD, так как она будет всегда возвращать номер лценции ноль - ну так ребята, не используйте пиратский софт. Желание работать на пиратском Архикаде и в тоже самое время пытаться защитить лицензией библиотечные элементы от пиратства выглядит как то странно.
Еще один нюанс. Как так Графисофт перешел от физических ключей защиты к закодированным файлам, надо использовать
n=REQUEST ("Configuration_number", "", ...) - это "string" который начинается с SW... и длинным номером
Если все-таки компания использует физический ключ, тогда надо запрашивать его номер через:
REQ("Serial_number")
Нельзя запрашивать серийный номер ключа, если он не физический. У софт-ключа тоже есть серийный номер, но он меняется каждый раз когда файл лицензии загружается на компьютер (например надо загружать на сервер и обратно в компьютер ключ после серьезных обновлений операционной системы).
Скрипт может выгладить как-то так:
Макрос:
licenseConfNum[n][2] - массив в параметрах элемента, который хранит номера лицензий
Скажем где в два столбца будет записываться:
Номер лицензии Описание
SW00001234 Мой компьютер
SW00012345 Компьютер кого-то
SW00123456 Компьютер еще кого-то
Мастер скрипт:
IF GLOB_SCRIPT_TYPE<>5 THEN
n=REQUEST ("Configuration_number", "", stConfigurationNumber)
mylicense=0
IF n THEN
FOR i=1 TO VARDIM1(licenseConfNum)
IF licenseConfNum[1]=stConfigurationNumber THEN mylicense=1
NEXT i
ENDIF
ENDIF
2Д скрипт:
END mylicense
3Д скрипт:
END mylicense
UI скрипт:
IF NOT(mylicense) THEN
UI_DIALOG "ЛИЦЕНЗИЯ НЕ НАЙДЕНА!", 444, 296
UI_STYLE 2,1
UI_OUTFIELD "Это лицензионная версия библиотеки", 35, 5
UI_OUTFIELD "Все параметры заблокированы.", 35, 20
UI_OUTFIELD "Обратитесь к разработчикам за лицензией:", 35, 35
UI_BUTTON UI_LINK, "mymail@mail.com", 100, 150, 250, 30, 0, "mailto:mymail@mail.com?Subject=ArchiCAD%20Library%20License"
ENDIF
END mylicense
В основном объекте мастер скрипт начать так:
CALL "LicenseMacro" PARAMETERS RETURNED_PARAMETERS mylicense
И UI начать так:
IF NOT(mylicense) THEN END
Вот и все, что я могу сказать про Вьетнам.