| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как запустить LISP программу при создании чертежа по шаблону? (Автоматическое заполнение основной надписи)

LISP. Как запустить LISP программу при создании чертежа по шаблону? (Автоматическое заполнение основной надписи)

Ответ
Поиск в этой теме
Непрочитано 31.03.2011, 11:47 #1
LISP. Как запустить LISP программу при создании чертежа по шаблону? (Автоматическое заполнение основной надписи)
Do$
 
AutoCAD/Civil3D LISP/C#
 
Санкт-Петербург
Регистрация: 15.08.2008
Сообщений: 1,702

Уважаемые форумчане, прошу совета!
Возникла мысль пограммно изменять шаблон в зависимости от того, кто создает чертеж (считываем переменную "username" и в зависимости от ее значения заполняем основную надпись шаблона). Изначально идея была разместить рядом с шаблоном DWT файл acaddoc.lsp и в нем описать все необходимые манипуляции, но, как оказалось, acaddoc.lsp не запускается при создании файла на основе шаблона . Что можно еще придумать? Создавать для каждого юзера отдельный шаблон - то еще счастье...
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 31.03.2011 в 16:09.
Просмотров: 16664
 
Непрочитано 31.03.2011, 11:54
#2
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Я бы думал о том, чтобы менять существующий файл при открытии.
Кстати, а что будет, если каталог с шаблоном и acaddoc.lsp поместить "на самый верх" в общем списке путей поддержки?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 31.03.2011, 12:06
#3
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Я бы думал о том, чтобы менять существующий файл при открытии.
Поддерживаю.

Такой вариант. Создать корпоративный файл настройки (***.cui) в нем прописать что-то типа
<LSPFile>\\Server\Шаблоны\Программы и настройки\Change_Parametrs.LSP</LSPFile>
а в самом Change_Parametrs.LSP уже все на что фантазии хватит
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 31.03.2011, 12:38
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


А ведь и правда, если acddoc.lsp поместить не в папку шаблонов, а в папку из списка путей поддержки - то запускается при открытии/создании любого чертежа! Но пока не могу понять, как теперь определить, что создан новый чертеж на основе шаблона, а не открыт существующий?
Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Такой вариант. Создать корпоративный файл настройки (***.cui) в нем прописать что-то типа
<LSPFile>\\Server\Шаблоны\Программы и настройки\Change_Parametrs.LSP</LSPFile>
а в самом Change_Parametrs.LSP уже все на что фантазии хватит
К стыду своему, со структурой файла cui не знаком, теги <LSPFile></LSPFile> определяют автозагружаемый LISP файл?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 13:06
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Зачем вообще менять шаблон ради того, чтобы что-то делать сязанное с именем пользователя? Тем более такое простое, как заполнение основной надписи?

Да чего угодно можно сделать в acaddoc.lsp, если вне функция будет читать какие-то настройки, записанные в файл, находящийся в каталоге пользователя. Т.е. где-то в %LocalApplicationData%. Путь к этому файлу легко вычислить независимо от Автокада вообще.

А для основных надписей скорее надо автоматически заполнять длинные строки наименований. Они могут быть в INI-файле, находящемся в папке чертежей. 100 файлов - одна запись в INI - 1000 jlbyrjds[ yflgbctq/
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 31.03.2011, 13:40
#6
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Зачем вообще менять шаблон ради того, чтобы что-то делать сязанное с именем пользователя? Тем более такое простое, как заполнение основной надписи?
Начать хочу с простого
Сделал динамическоий блок - границы формата+основная надпись. Динамический блок потому, что форматы все не предусмотреть заранее: чертежи выпускаем в виде "портянок" <Число>хА4, где <Число> может быть любым натуральным числом. Титул, название раздела, название чертежа - в виде многострочных атрибутов. Номер чертежа, лист, листов, стадия - однострочные атрибуты. Даты - в виде текста с полями. Фамилии - в виде однострочного текста внутри блока.
Вот и хочу, чтобы создавая чертеж на основе шаблона, в котором уже вставлен этот блок, фамилии в основной надписи менялись в зависимости от того, кто чертеж создает. При этом, хочется совершать минимум манипуляций на отдельном копьютере.
Возникла идея - на сервере разместить шаблоны чертежей, там же - файл acaddoc.lsp, там же - текстовый файлик соответствия имен пользователей и фамилий. Впоследствии можно будет извлекать и названия титулов из документа на сервере и вставлять их в основную надпись...
Вот такая вот небольшая автоматизация, при этом достаточно один раз на каждом компьютере настроить путь к шаблонам и файлу acaddoc.lsp.
Пока что нашел как определить новый файл создан или открыт существующий:
Код:
[Выделить все]
 (alert
  (strcat
    (getenv "username")
    ": "
    (if (findfile (strcat (getvar "dwgprefix") (getvar "dwgname")))
      "Открыт существующий чертеж!"
      "Создан новый чертеж!"
    ) ;_ end of if
  ) ;_ end of strcat
) ;_ end of alert
Как определить на основе какого шаблона создан чертеж?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 31.03.2011 в 13:50.
Do$ вне форума  
 
Непрочитано 31.03.2011, 14:24
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Возникла идея - на сервере разместить шаблоны чертежей, там же - файл acaddoc.lsp, там же - текстовый файлик соответствия имен пользователей и фамилий. Впоследствии можно будет извлекать и названия титулов из документа на сервере и вставлять их в основную надпись...
Имхо, если уж писать код, то эту информацию (ФИО) лучше тянуть программно из Active Directory, не заморачиваясь с текстовыми файлами. Не знаю, есть ли в лиспе "реактор" на создание нового файла - в .Net API однозначно можно получить событие создания нового чертежа. Информацию вроде фамилий лучше хранить здесь:

и програмно изменять, если уж так хочется.
Инфу вроде наименования объекта и его шифра - в свойствах подшивки.
п.с.
Если интересует код, как получить эту инфу из Active Directory - могу дать пример - делается элементарно. Правда оболочку для лисп-функции сам тогда напишешь - это не сложно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 31.03.2011 в 14:32. Причина: добавил "п.с."
hwd вне форума  
 
Автор темы   Непрочитано 31.03.2011, 14:55
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Осталось узнать, что такое Active Directory и с чем ее едят.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 15:02
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Осталось узнать, что такое Active Directory и с чем ее едят.
Active Directory.
Если коротко - в отделе кадров вашей конторы сидит девушка/бабушка, которая при приёме на работу юзеров вбивает в компьютер информацию о них. На основании этой инфы администраторы создают профили новых пользователей для того, чтобы те могли работать в составе домена. Через Active Directory ты с любого компьютера, подключенного к вашей сети сможешь получить инфу по домену/доменным группам/юзерам/компьютерам, если обратишься к нему (Active Directory) программно.
Копипаст (методы, извлекающие различного рода информацию) из Active Directory:
Код:
[Выделить все]
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;
using System.Runtime.InteropServices;
using AdminCAD.Configuration;

namespace AdminCAD.DirectoryServices {
    /// <summary>
    /// Статический класс, предоставляющий некоторую информацию о текущем пользователе домена
    /// </summary>
    public static class CurrentDomainUser {

        /// <summary>
        /// Имя текущего доменного пользователя
        /// </summary>
        public static string GetCurrentUserName() {
            return UserPrincipal.Current.Name;
        }

        /// <summary>
        /// Отчество текущего доменного пользователя
        /// </summary>
        public static string GetCurrentUserMiddleName() { return UserPrincipal.Current.MiddleName; }

        /// <summary>
        /// Фамилия текущего доменного пользователя
        /// </summary>
        /// <returns>Фамилия</returns>
        public static string GetCurrentUserSurname() {
            return UserPrincipal.Current.Surname;
        }

        /// <summary>
        /// Примечание, относящееся к текущему доменному пользователю
        /// </summary>
        public static string GetCurrentUserDescription() { return UserPrincipal.Current.Description; }

        /// <summary>
        /// Отображаемое имя текущего доменного пользователя
        /// </summary>
        public static string GetCurrentUserDisplayName() { return UserPrincipal.Current.DisplayName; }

        /// <summary>
        /// Адрес электронной почты текущего доменного пользователя
        /// </summary>
        public static string GetCurrentUserEmailAddress() { return UserPrincipal.Current.EmailAddress; }

        /// <summary>
        /// Перечень доменных групп, в состав которых входит текущий доменный пользователь
        /// </summary>
        public static string[] GetCurrentUserDomainGroups() { return UserPrincipal.Current.GetGroups().Select(n => n.Name).ToArray(); }

        /// <summary>
        /// Получить полный перечень доменных групп, имеющихся в составе определённого домена
        /// </summary>
        /// <param name="DomainName">Имя домена, для которого следует получить перечень всех его доменных групп</param>
        /// <returns>Имена доменных групп, входящих в состав указанного домена</returns>
        public static IEnumerable<string> GetDomainGroups(string DomainName) {
            using (var context = new PrincipalContext(ContextType.Domain, DomainName))
            using (var queryFilter = new GroupPrincipal(context))
            using (var searcher = new PrincipalSearcher(queryFilter)) {
                foreach (var result in searcher.FindAll()) {
                    yield return result.SamAccountName;
                    result.Dispose();
                }
            }
        }

        /// <summary>
        /// Получить имена всех доменных групп, входящих в состав текущего домена
        /// </summary>
        /// <returns>Имена всех доменных групп текущего домена</returns>
        public static IEnumerable<string> GetDomainGroups() {
            return GetDomainGroups(Domain.GetCurrentDomain().Name);
        }

        /// <summary>
        /// Обладает ли текущий пользователь правами администратора для данной локальной машины
        /// </summary>
        /// <returns>true - да, false - нет.</returns>
        [DllImport("shell32.dll")]
        public static extern bool IsUserAnAdmin();

        /// <summary>
        /// Является ли текущий пользователь членом указанной доменной группы
        /// </summary>
        /// <param name="groupName">Имя доменной группы, членство которой проверяется</param>
        /// <returns>true - является, false - нет.</returns>
        public static Boolean IsMemberOfGroup(string groupName){
            return GetCurrentUserDomainGroups().Select(n => n.ToUpper()).Contains(groupName.ToUpper());
        }

        /// <summary>
        /// Является ли текущий пользователь руководителем указанной доменной группы
        /// </summary>
        /// <param name="groupName">Имя проверяемой доменной группы</param>
        /// <param name="config">Объект, хранящий в себе настройки Системы</param>
        /// <returns>true - является, false - нет.</returns>
        public static bool IsTeamManagerOfGroup(string groupName, CommonSettings config) {
            bool isTargetGroupMember = IsMemberOfGroup(groupName);
            bool isTeamManagerGroupMember = IsMemberOfGroup(config.TeamGroupName);
            return isTargetGroupMember && isTeamManagerGroupMember;
        }

        /// <summary>
        /// Является ли пользователь администратором CAD указанной Системы
        /// </summary>
        /// <param name="config">Объект, хранящий в себе настройки Системы</param>
        /// <returns>true - является, false - нет.</returns>
        public static bool IsAdminCAD(CommonSettings config) {
            string domain = config.DomainName;
            string adminCadLogin = config.AdminCadLogin;
            string currentDomainName = Environment.UserDomainName;
            string currentLogin = GetCurrentUserDisplayName();
            return (domain.ToUpper() == currentDomainName.ToUpper()) && (adminCadLogin.ToUpper() == currentLogin.ToUpper());
        }
    }
}
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 31.03.2011 в 19:03.
hwd вне форума  
 
Непрочитано 31.03.2011, 15:42
#10
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Бред какой-то...
Во первых не понятно почему не загружается acad20**doc.lsp
Во вторых, применение полей сводит к нулю необходимость вообще использовать какой-либо лисп, о чем, я думаю, намекает hwd
В третьих, для выполнения лиспа нужно время... иногда даже доли секунды провоцируют нервный срыв...
В четвертых создавать конфигурационный файл для каждого не проще чем создавать шаблон...
В пятых, дайте свободу вашим пользователям и они сделают вашу работу за вас лучше для себя...
В шестых, не делайте работу за автокад, он и сам это умеет, я говорю опять же об индивидуальном шаблоне для каждого, т.е. он станет потом индивидуальным, в процессе работы...
В общем овчинка-то выеденного яйца не стоит
gomer вне форума  
 
Автор темы   Непрочитано 31.03.2011, 15:48
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Суть ясна, но я понятия не имею, какие данные вносятся в наш Active Directory и как структурируются, как их оттуда извлекать и т.п. Боюсь, что мне пока не по силам эти дебри, так что, пока обойдусь собственноручной текстовой базой.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 15:51
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от gomer Посмотреть сообщение
Во вторых, применение полей сводит к нулю необходимость вообще использовать какой-либо лисп, о чем, я думаю, намекает hwd
Совершенно верно - поля тянут информацию из свойств чертежа, указанных мною на скрине. Если есть острое желание, чтобы в поле "Исполнил" автоматом вставлялось фио того, кто создаёт этот чертёж - выше показал код, как эту инфу (и не только её) можно вытащить из AD. Но не думаю, что это того стоит. Имхо - юзер сам должен осмысленно заполнить записи, показанные мною на скрине - так будет лучше.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 31.03.2011, 16:03
#13
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Поля это хорошо, но как быть с форматированием текста, если, к примеру, фамилия длинная и не помещается в отведенное пространство в основной надписи?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 16:07
#14
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Do$ Посмотреть сообщение
Поля это хорошо, но как быть с форматированием текста, если, к примеру, фамилия длинная и не помещается в отведенное пространство в основной надписи?
Выравнивание по содержимому (Fit)
gomer вне форума  
 
Непрочитано 31.03.2011, 16:08
#15
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Поля это хорошо, но как быть с форматированием текста, если, к примеру, фамилия длинная и не помещается в отведенное пространство в основной надписи?
Во вхождении блока можно войти в редактор значений атрибутов и сжать текст, если нужно (вкладка TextOptions).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 31.03.2011, 16:18
#16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


В этом есть здравый смысл... Буду думать, спасибо за ваше мнение!
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.03.2011, 16:42
#17
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Как определить на основе какого шаблона создан чертеж?
1. В Custom Properties (как в #7) прописываешь свойство (например Шаблон) с нужным значением (например КЖ)
2. Анализируешь переменную DWGTITLED
3. Если DWGTITLED=0, то создан новый чертеж. Читаешь значение свойства "Шаблон" и принимаешь дальнейшее решение.
DwgRuLispLib: Функции чтения и установки свойств рисунка (_dwgprops)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 31.03.2011, 18:46
#18
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А для основных надписей скорее надо автоматически заполнять длинные строки наименований. Они могут быть в INI-файле, находящемся в папке чертежей. 100 файлов - одна запись в INI - 1000 одинаковых надписей.
Согласен с автором.
Вот привожу пример программного заполнения рамки с заполнением штампа.
Обратите, например, внимание на словари фамилий проверяющего (он м.б. не один) и т.д. и т.п.
Ничего этого из Active Directory, да еще и автоматом Вы не получите.
Надо давать и пользователю поработать. Только программно помогать надо.
Миниатюры
Нажмите на изображение для увеличения
Название: Parks_Stamp.jpg
Просмотров: 213
Размер:	59.8 Кб
ID:	56726  
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 31.03.2011, 19:00
#19
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Alan Посмотреть сообщение
Ничего этого из Active Directory, да еще и автоматом Вы не получите.
Не надо мешать мух и котлеты. Автор топика указал, что автоматом хочет заполнять одну ячейку, содержащую инфу о том, кто исполнил чертёж. Эту инфу из AD легко получить. Если автоматом должны заполняться все участники - это совсем др. вопрос и в этом случае AD конечно не к месту (разве что "Исполнил" заполнить).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 31.03.2011 в 19:07.
hwd вне форума  
 
Автор темы   Непрочитано 01.04.2011, 08:16
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Автор топика указал, что автоматом хочет заполнять одну ячейку, содержащую инфу о том, кто исполнил чертёж.
Не совсем так. В зависимости от автора чертежа могут меняться и остальные фамилии, но для одного разработчика двух разных нормоконтролеров или утверждающих быть не может - то есть, если определить автора чертежа, то можно однозначно определить остальные фамилии.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как запустить LISP программу при создании чертежа по шаблону? (Автоматическое заполнение основной надписи)

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из lisp запустить еxe? tinik_89 LISP 17 15.07.2011 09:18
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
LISP для очистки чертежа от дублирующихся объектов Nikolays AutoCAD 5 13.12.2010 16:59
Как из Delphi запустить программу на AutoLISP Valery LISP 1 23.09.2005 20:51
Не удается запустить программу из загруженного ARX-файла plaz Программирование 2 01.09.2003 07:35