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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Net. Создание и модификация материала

Net. Создание и модификация материала

Ответ
Поиск в этой теме
Непрочитано 14.11.2007, 16:29 #1
Net. Создание и модификация материала
Павлюкас
 
Москва
Регистрация: 08.10.2007
Сообщений: 42

Описание в "Создание материала в AutoCad.doc" архива.

Всё, что нужно для создания материала в AutoCAD'е.
Удачи!!!

Вложения
Тип файла: rar AcadMaterial.rar (300.7 Кб, 536 просмотров)

Просмотров: 10119
 
Непрочитано 16.11.2007, 12:52
#2
BigBrother

Design & programming :)
 
Регистрация: 14.02.2004
Новосибирск
Сообщений: 172
<phrase 1= Отправить сообщение для BigBrother с помощью Skype™


das ist fantastisch :-)
Мечтательно... теперь бы еще и что нибудь для редактирования наложения текстуры. Бо за интерфейс редактирования руки по самую майку кому то в Autodesk оторвать следовало.
Хотя свою на лиспе почти добил, осталось реализовать только обработку объектов в блоках.
И кстати, планируется ли поддержка новых фич материалов 2008-го?
BigBrother вне форума  
 
Автор темы   Непрочитано 16.11.2007, 14:11
#3
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


В каком смысле редактирование наложения текстуры?
Ты имеешь ввиду изменения в текстуре масштаба, угла поворота смещения и т.д.?
В 2008 пока не работаю. Как появится возможность - сделаю.
Павлюкас вне форума  
 
Непрочитано 16.11.2007, 20:52
#4
BigBrother

Design & programming :)
 
Регистрация: 14.02.2004
Новосибирск
Сообщений: 172
<phrase 1= Отправить сообщение для BigBrother с помощью Skype™


Нет, имелось ввиду наложение материала на объекты индивидуально.
Никакой возможности ввести точные значения нет, делается все только мышкой черт бы их побрал.
BigBrother вне форума  
 
Непрочитано 17.09.2010, 17:44
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


что-то длл-ка грузиться не хочет
Цитата:
Command: (command "_.netload" "AcadMaterial.dll")
nil
Command: _.netload
Cannot load assembly. Error details: Autodesk.AutoCAD.Runtime.Exception:
eDuplicateKey
at Autodesk.AutoCAD.Runtime.Interop.Check(Int32 returnValue)
at AcMgCommandClass.AddCommand(AcMgCommandClass* , ICommandLineCallable ca,
MethodInfo mi)
at
Autodesk.AutoCAD.ApplicationServices.AutoCADApplicationHolder.Initialize(Assembl
y assembly)
at
Autodesk.AutoCAD.ApplicationServices.ExtensionLoader.ProcessAssembly(Assembly
assembly)

Последний раз редактировалось Supermax, 17.09.2010 в 20:25.
Supermax вне форума  
 
Непрочитано 17.09.2010, 18:39
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Наверняка проблема в том, что разрабатывалась dll для одной версии (например, 2006), а подгружается в другую (например, 2007-2009).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.09.2010, 20:25
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Нет. 2006, 2007, 2010 не идет нигде.
Надо копаться и создавать материал по другому.
Supermax вне форума  
 
Непрочитано 21.09.2010, 16:56
#8
hwd

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


Цитата:
Сообщение от Павлюкас Посмотреть сообщение
Описание в "Создание материала в AutoCad.doc" архива.

Всё, что нужно для создания материала в AutoCAD'е.
Удачи!!!
Исходники можете выложить (любопытно глянуть)?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 23.09.2010, 10:33
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А автор, между прочим, никаких признаков жизни с 2009 года на форуме не проявлял. Исходники видимо тю-тю . Надо своими силами попытаться справиться.
Для начала прояснить вопрос где в древе када прячутся объекты именуемые "материал".
Supermax вне форума  
 
Непрочитано 23.09.2010, 11:01
#10
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от Supermax Посмотреть сообщение
Для начала прояснить вопрос где в древе када прячутся объекты именуемые "материал".
Наверно в словаре ACAD_MATERIAL!?
А сборку автора можно в рефлекторе глянуть.
Vildar вне форума  
 
Непрочитано 23.09.2010, 20:34
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Наверно в словаре ACAD_MATERIAL!?
А сборку автора можно в рефлекторе глянуть.
А поподробнее, и то, и другое? А то для меня что рефлектор, что компрессор - почти одинаково.
Я так думаю, что описание материала где-то в словаре лежит, а словарь где лежит? Как материал к объекту привязывается? Почему у 3D солида материал можно привязать к каждой плоскости? Если расшифровать данные 3D солида надо наверное искать что? Указатель на объект, наименование материала или еще что-нибудь?
Supermax вне форума  
 
Непрочитано 23.09.2010, 20:54
#12
hwd

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
А поподробнее, и то, и другое? А то для меня что рефлектор, что компрессор - почти одинаково.
рефлектор - позволяет декодировать откомпилированные .net-файлы в исходный код различных .net-языков. С его помощью изучают чужой код. Однако, если автор кода выполнит для него обфускацию - рефлектор не особо поможет, т.к. результат декодирования становится труден для понимания. В этом случае может даже лучше будет сразу смотреть сам CIL - своего рода ассемблер мира .net.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 23.09.2010 в 21:03.
hwd вне форума  
 
Непрочитано 23.09.2010, 21:02
#13
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
рефлектор - позволяет декодировать откомпилированные .net-файлы в исходный код различных .net-языков. С его помощью изучают чужой код.
Ага, динамитом предлагаете посмотреть? Это, конечно, всегда можно, только вот нету у меня динамиту. А кирка с лопатой (другого не имею) тут видимо не подойдут.
Supermax вне форума  
 
Непрочитано 23.09.2010, 21:04
#14
hwd

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Ага, динамитом предлагаете посмотреть? Это, конечно, всегда можно, только вот нету у меня динамиту. А кирка с лопатой (другого не имею) тут видимо не подойдут.
На русский переведите.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 23.09.2010, 21:19
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Так по русски же и пишу. Нету рефлектора есть только AutoLisp и VisualLisp.
Supermax вне форума  
 
Непрочитано 23.09.2010, 21:22
#16
hwd

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Так по русски же и пишу. Нету рефлектора есть только AutoLisp и VisualLisp.
Вы спросили Vildar про рефлектор. Я вам ответил что это такое и с чем его едят. При чём здесь лисп? Библиотека данного топика написана на .Net. Такие библиотеки изучаются с помощью рефлектора. Лисп нервно курит в сторонке. По указанной мною ссылке рефлектор можно скачать и использовать бесплатно (было бы желание).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 23.09.2010 в 21:41.
hwd вне форума  
 
Непрочитано 23.09.2010, 21:53
#17
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Это я и сам понял. Только вот в net я как баран в маркетинге. Короче, я могу на лиспе вспахать словари и попытаться создать материал тобишь словарь. Правда не уверен что автокад даст мне такую возможность. Он не все виды словарей разрешает делать на лиспе.
Потом, по своему опыту знаю, что чужой код изучать, даже исходники, дело не для слабонервных, и только в редких случаях это приходится делать.
Supermax вне форума  
 
Непрочитано 23.09.2010, 22:18
#18
hwd

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Это я и сам понял. Только вот в net я как баран в маркетинге.
Значит рефлектор вам не поможет.
Цитата:
Сообщение от Supermax Посмотреть сообщение
Потом, по своему опыту знаю, что чужой код изучать, даже исходники, дело не для слабонервных, и только в редких случаях это приходится делать.
Это зависит от того, как он написан и насколько подробно разъяснён в комментариях.
Пример. Комментарии к коду присутствуют чуть ли не через строчку -т.е. разобраться не составит труда (для тех, кто пишет на C# конечно же).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 23.09.2010, 23:01
#19
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну пока мы тут бла, бла, бла, я все сделал.
Значица так:
Есть в текущем документе глобальный словарь. Его мы получаем функцией (namedobjdict)
В нем есть словарь "ACAD_MATERIAL" а точнее точечная пара 3, за которой идет точечная пара 350 с казателем на этот словарь. Выколупываем и разворачиваем.
Код:
[Выделить все]
(setq allmaterial (entget (cdadr (member '(3 . "ACAD_MATERIAL") (entget (namedobjdict))))))
Берем словарь с материалом "Global", выколупываем 350 пару с его указателем и разворачиваем. Этот материал есть у всех.
Код:
[Выделить все]
(setq globalmaterial (entget (cdadr (member '(3 . "Global") allmaterial))))
Выкидываем из списка описания материала точечные пары -1, 5 и 1.
Вместо 1 точечной пары вставляем свою, со своим именем "Новый".
Код:
[Выделить все]
(setq globalmaterial- (vl-remove (assoc -1  globalmaterial) globalmaterial))
(setq globalmaterial- (vl-remove (assoc 5  globalmaterial-) globalmaterial-))
(setq globalmaterial- (vl-remove (assoc 1  globalmaterial-) globalmaterial-))
(setq globalmaterial- (append globalmaterial- '((1 . "Новый"))))
Создаем новый словарь с описанием материала
Код:
[Выделить все]
(setq noviymaterial (entmakex globalmaterial-))
Добавляем в словарь с материалами новую 3 и 350 пары с новым именем материала и указателем на него
Код:
[Выделить все]
(entmod (append allmaterial '((3 . "Новый")) (list (cons 350 noviymaterial))))
Усе. Все замечательно создалось и в текущем документе появился новый материал с аналогичными свойствами как у материала "Global" можете проверить.

Лично мне больше не надо, а другим можно что-то в списке изменять. Там все изменяется.

Удаление материала, что не маловажно:
Код:
[Выделить все]
(command "_-purge" "ma" "Новый" "Y" "Y")

Последний раз редактировалось Supermax, 23.09.2010 в 23:34.
Supermax вне форума  
 
Автор темы   Непрочитано 23.09.2010, 23:48
#20
Павлюкас


 
Регистрация: 08.10.2007
Москва
Сообщений: 42


Можно Reflector'ом конечно. Код весь открыт
Supermax, насколько я помню - Писал под 2006-2007. Только сейчас не поленился и проверял в 2009. Всё работает
Через точечные пары лиспа далеко не всё можно решить, тем более, что в 2010 доступных свойств серьёзно поубавилось.
Не знаю, как в AutoCAD, но в AutoCAD Architecture их почти не осталось
Можешь представить, что будет в 2012 версии?))
Я тоже обожаю программировать на лиспе и только на нём и пишу, если конечно задачу возможно на нём решить, но про точечные пары пора забывать.

Код:
[Выделить все]
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.Geometry;
using System;

[assembly: CommandClass(typeof(PahAec.MaterialObjectId))]

namespace PahAec
{
    class MaterialObjectId
    {
        public MaterialObjectId()
        {
        }

        private bool hasmaterial(Database m_db, string matname, out ObjectId id)
        {
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();

            bool bexist = false;
            id = ObjectId.Null;
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForRead))
                {
                    if (dict.Contains(matname))
                        id = dict.GetAt(matname);
                    if (id != ObjectId.Null)
                        bexist = true;
                }
                tr.Commit();
                return bexist;
            }
        }

        private bool addMaterial(Database m_db, Material Mat, out ObjectId idm)
        {
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            ObjectId id;
            idm = ObjectId.Null;
            if (hasmaterial(m_db, Mat.Name, out id))
                return true;
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    idm = dict.SetAt(Mat.Name, Mat);
                    
                    tr.AddNewlyCreatedDBObject(Mat, true);
                }
                tr.Commit();
                return true;
            }

        }

        private void
        CreateMaterial(string materialName)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database m_db = doc.Database;
            Editor ed = doc.Editor;
            Material Mat = new Material();
            Mat.Name = materialName;
            ObjectId MatId = ObjectId.Null;
            addMaterial(m_db, Mat, out MatId);
        }
        [CommandMethod("MaterialAdd", CommandFlags.Modal)]
        public void
        AddMaterialToPallete()
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            PromptStringOptions optString = new PromptStringOptions("\n name material:");
            
            optString.AllowSpaces = true;
            PromptResult prName = ed.GetString(optString);
            if (prName.Status != PromptStatus.OK)
                return;
            string matName = prName.StringResult;
            Material Mat = new Material();
            Mat.Name = matName;
            CreateMaterial(matName);
        }



        private void
        SetMaterialMode(string materialName, bool modetype, bool MetalShader)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                        Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                        Mat.Mode = Mode.Realistic;
                        Mat.IlluminationModel = IlluminationModel.BlinnShader;
                        if (!modetype)     
                        Mat.Mode = Mode.Advanced;
                    if (MetalShader)
                        Mat.IlluminationModel = IlluminationModel.MetalShader;
                }
                tr.Commit();
                return;
            }
        }

        private bool MaterialIdName(Database m_db, Editor ed, out string matName)
        {
            PromptStringOptions optString = new PromptStringOptions("\n name material:");
            optString.AllowSpaces = true;
            PromptResult prName = ed.GetString(optString);
            if (prName.Status != PromptStatus.OK)
            {
                matName = "";
                return false;
            }
            matName = prName.StringResult;
            ObjectId id;
            if (!hasmaterial(m_db, matName, out id))
            {
                ed.WriteMessage(string.Format("\nMaterial name: \"{0}\" does not exist.", matName));
                return false;
            }
            return true;
        }

        private void
        BlendFactor(out double factor)
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            
            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Blend factor:<0 - 100> ");
                if (prNameItem.Status != PromptStatus.OK)
                {
                    factor = 0;
                    return;
                }
                double ItemComp = prNameItem.Value;
                if (ItemComp >= 0 & ItemComp <= 100)
                {
                    factor = ItemComp / 100;
                    return;
                }
            }
        }


        private void
       SetMaterialSelfIllumination(string materialName, double doub)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;

            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    Mat.SelfIllumination = doub;
                }
                tr.Commit();
                return;
            }
        }

        [CommandMethod("SetMaterialSelfIllumination", CommandFlags.Modal)]
        public void
        SetMaterialSelfIllumination()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (!MaterialIdName(m_db, ed, out matName))
                return;
            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n SelfIllumination %:<0 - 100> ");
                if (prNameItem.Status != PromptStatus.OK) return;
                double ItemComp = prNameItem.Value;
                if (ItemComp >= 0 & ItemComp <= 100)
                {
                    SetMaterialSelfIllumination(matName, ItemComp/100);
                    return;
                }
                ed.WriteMessage(string.Format("\nInvalid data", matName));
            }
            
        }


        private void
       SetMaterialTranslucence(string materialName, double doub)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;

            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    Mat.Translucence = doub;
                }
                tr.Commit();
                return;
            }
        }

        [CommandMethod("SetMaterialTranslucence", CommandFlags.Modal)]
        public void
        SetMaterialTranslucence()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (!MaterialIdName(m_db, ed, out matName))
                return;
            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Translucence %:<0 - 100> ");
                if (prNameItem.Status != PromptStatus.OK) return;
                double ItemComp = prNameItem.Value;
                if (ItemComp >= 0 & ItemComp <= 100)
                {
                    SetMaterialTranslucence(matName, ItemComp / 100);
                    return;
                }
                ed.WriteMessage(string.Format("\nInvalid data", matName));
            }

        }

        private void
        SetMaterialFlag(string materialName, int i)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                        Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                     switch (i)
            {
                case 0:
                    Mat.ChannelFlags = ChannelFlags.None;
                    break;
                case 1:
                    Mat.ChannelFlags = ChannelFlags.UseAll;
                    break;
                case 2:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseBump;
                    break;
                case 3:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseDiffuse;
                    break;
                case 4:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseOpacity;
                    break;
                case 5:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseReflection;
                    break;
                case 6:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseRefraction;
                    break;
                case 7:
                    Mat.ChannelFlags = Mat.ChannelFlags | ChannelFlags.UseSpecular;
                    break;
                default:
                    return;
            }
                }
                tr.Commit();
                return;
            }
        }

        [CommandMethod("SetMaterialFlag", CommandFlags.Modal)]
        public void
        SetMaterialFlag()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (!MaterialIdName(m_db, ed, out matName))
                return;
            PromptKeywordOptions prOpts = new PromptKeywordOptions("Flag ");
            prOpts.Keywords.Add("None");
            prOpts.Keywords.Add("All");
            prOpts.Keywords.Add("Bump");
            prOpts.Keywords.Add("Diffuse");
            prOpts.Keywords.Add("Opacity");
            prOpts.Keywords.Add("Reflection");
            prOpts.Keywords.Add("Refraction");
            prOpts.Keywords.Add("Specular");
            prOpts.Keywords.Default = "None";
            PromptResult prRes = ed.GetKeywords(prOpts);

            if (prRes.Status != PromptStatus.OK)
            {
                return;
            }
            int i;
            switch (prRes.StringResult)
            {
                case "None":
                    i = 0;
                    break;
                case "All":
                    i = 1;
                    break;
                case "Bump":
                    i = 2;
                    break;
                case "Diffuse":
                    i = 3;
                    break;
                case "Opacity":
                    i = 4;
                    break;
                case "Reflection":
                    i = 5;
                    break;
                case "Refraction":
                    i = 6;
                    break;
                case "Specular":
                    i = 7;
                    break;
                default:
                    return;
            }      
            SetMaterialFlag(matName, i);
        }


        [CommandMethod("MaterialTemplate", CommandFlags.Modal)]
        public void
        SetMaterialTemplate()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (!MaterialIdName(m_db, ed, out matName))
                return;
            PromptKeywordOptions prOpts = new PromptKeywordOptions("Type texture: ");
            prOpts.Keywords.Add("Realistic");
            prOpts.Keywords.Add("Advanced");
            prOpts.Keywords.Default = "Realistic";

            PromptResult prRes = ed.GetKeywords(prOpts);
            if (prRes.Status != PromptStatus.OK)
            {
                return;
            }
             bool modetype=true;
             if (prRes.StringResult == "Advanced")
             { modetype = false; }


             PromptKeywordOptions prOpts1 = new PromptKeywordOptions("Metal?: ");
             prOpts1.Keywords.Add("Yes");
             prOpts1.Keywords.Add("No");
             prOpts1.Keywords.Default = "No";

             PromptResult prRes1 = ed.GetKeywords(prOpts1);
             if (prRes1.Status != PromptStatus.OK)
             {
                 return;
             }
             bool MetalShader = false;
             if (prRes1.StringResult == "Yes")
             { MetalShader = true; }
            SetMaterialMode(matName, modetype, MetalShader);
        }

        private Mapper
        EditMapperMaterial(string materialName)
        {
            Mapper mapper1 = new Mapper();
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Matrix3d mtx = new Matrix3d();
            Point3d pnt = new Point3d(0,0,0);


            PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Adjust Scale: ");
            if (prNameItem.Status != PromptStatus.OK) return mapper1;
            double ItemComp = prNameItem.Value;
                mtx = Matrix3d.Scaling(ItemComp, pnt);
            PromptKeywordOptions prOpts1 = new PromptKeywordOptions("Type Transform: ");
            prOpts1.Keywords.Add("InheritAutoTransform");
            prOpts1.Keywords.Add("Model");
            prOpts1.Keywords.Add("None");
            prOpts1.Keywords.Add("TransformObject");
            prOpts1.Keywords.Default = "None";

            PromptResult prRes1 = ed.GetKeywords(prOpts1);
            if (prRes1.Status != PromptStatus.OK)
            {
                return mapper1;
            }

            AutoTransform att;
            switch (prRes1.StringResult)
            {
                case "InheritAutoTransform":
                    att = AutoTransform.InheritAutoTransform;
                    break;
                case "Model":
                    att = AutoTransform.Model;
                    break;
                case "None":
                    att = AutoTransform.None;
                    break;
                case "TransformObject":
                    att = AutoTransform.TransformObject;
                    break;
                default:
                    return mapper1;
            }



            PromptKeywordOptions prOpts2 = new PromptKeywordOptions("Type Projection: ");
            prOpts2.Keywords.Add("Box");
            prOpts2.Keywords.Add("Cylinder");
            prOpts2.Keywords.Add("InheritProjection");
            prOpts2.Keywords.Add("Planar");
            prOpts2.Keywords.Add("TransformObject");
            prOpts2.Keywords.Default = "InheritProjection";

            PromptResult prRes2 = ed.GetKeywords(prOpts2);
            if (prRes2.Status != PromptStatus.OK)
            {
                return mapper1;
            }

            Projection pjt;
            switch (prRes2.StringResult)
            {
                case "Box":
                    pjt = Projection.Box;
                    break;
                case "Cylinder":
                    pjt = Projection.Cylinder;
                    break;
                case "InheritProjection":
                    pjt = Projection.InheritProjection;
                    break;
                case "Planar":
                    pjt = Projection.Planar;
                    break;
                case "TransformObject":
                    pjt = Projection.Sphere;
                    break;
                default:
                    return mapper1;
            }




            PromptKeywordOptions prOpts3 = new PromptKeywordOptions("Type Tilling: ");
            prOpts3.Keywords.Add("Clamp");
            prOpts3.Keywords.Add("Crop");
            prOpts3.Keywords.Add("InheritTiling");
            prOpts3.Keywords.Add("Tile");
            prOpts3.Keywords.Default = "Tile";

            PromptResult prRes3 = ed.GetKeywords(prOpts3);
            if (prRes3.Status != PromptStatus.OK)
            {
                return mapper1;
            }

            Tiling Tlng;
            switch (prRes3.StringResult)
            {
                case "Clamp":
                    Tlng = Tiling.Clamp;
                    break;
                case "Crop":
                    Tlng = Tiling.Crop;
                    break;
                case "InheritTiling":
                    Tlng = Tiling.InheritTiling;
                    break;
                case "Tile":
                    Tlng = Tiling.Tile;
                    break;
                default:
                    return mapper1;
            }
            mapper1 = new Mapper(pjt, Tlng,att, mtx);
            
            return mapper1;
        }


        private void
        EditMapperDiffuseMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    
                    MaterialMap map = new MaterialMap(Source.File, materialName, 
                        Mat.Diffuse.Map.Texture, Mat.Diffuse.Map.BlendFactor, EditMapperMaterial(materialName));
                    MaterialDiffuseComponent mdc = new MaterialDiffuseComponent(Mat.Diffuse.Color, map);
                    Mat.Diffuse = mdc;
                }
                tr.Commit();
                return;
            }
        }
        [CommandMethod("EditDiffuseMapperMaterial", CommandFlags.Modal)]
        public void
        EditDiffuseMapperMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
                EditMapperDiffuseMaterial(matName);
        }

        private void
        EditMapperOpacityMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    MaterialMap map = new MaterialMap(Source.File, materialName,
                        Mat.Opacity.Map.Texture, Mat.Opacity.Map.BlendFactor, EditMapperMaterial(materialName));
                    MaterialOpacityComponent mdc = new MaterialOpacityComponent(Mat.Opacity.Percentage, map);
                    Mat.Opacity = mdc;
                }
                tr.Commit();
                return;
            }
        }
        [CommandMethod("EditOpacityMapperMaterial", CommandFlags.Modal)]
        public void
        EditOpacityMapperMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
                EditMapperOpacityMaterial(matName);
        }




        private void
       EditMapperBumpMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    MaterialMap map = new MaterialMap(Source.File, materialName,
                        Mat.Bump.Texture, Mat.Bump.BlendFactor, EditMapperMaterial(materialName));
                    Mat.Bump = map;
                }
                tr.Commit();
                return;
            }
        }
        [CommandMethod("EditBumpMapperMaterial", CommandFlags.Modal)]
        public void
        EditBumpMapperMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
                EditMapperBumpMaterial(matName);
        }


        private void
       EditMapperReflectionMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    MaterialMap map = new MaterialMap(Source.File, materialName,
                        Mat.Reflection.Texture, Mat.Reflection.BlendFactor, EditMapperMaterial(materialName));
                    Mat.Reflection = map;
                }
                tr.Commit();
                return;
            }
        }
        [CommandMethod("EditReflectionMapperMaterial", CommandFlags.Modal)]
        public void
        EditReflectionMapperMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
                EditMapperReflectionMaterial(matName);
        }






        private void
        CreateTextureDiffuseMaterial(string materialName, string textureName
            )
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Mapper mapper1 = new Mapper(Projection.InheritProjection, Tiling.Tile,
                AutoTransform.TransformObject, Matrix3d.Identity);
            ImageFileTexture mttr = new ImageFileTexture();
            mttr.SourceFileName = textureName;
            ImageBackground ibgr = new ImageBackground();
            Scale2d sc = new Scale2d(10000);
            ibgr.Scale = sc;
            ibgr.ImageFileName = textureName;

            double factor = 0;
            BlendFactor(out factor);
            MaterialMap map = new MaterialMap(Source.File, textureName, mttr, factor, mapper1);
            EntityColor eclr = new EntityColor();
            MaterialColor mc = new MaterialColor(Method.Override, 1, eclr);
            MaterialDiffuseComponent mdc = new MaterialDiffuseComponent(mc, map);
            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    
                            Mat.Diffuse = mdc;
                }
                tr.Commit();
                return;
            }
        }


        private void
        CreateTextureOpacityMaterial(string materialName, string textureName
            )
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Mapper mapper1 = new Mapper(Projection.InheritProjection, Tiling.Tile,
                AutoTransform.TransformObject, Matrix3d.Identity);
            ImageFileTexture mttr = new ImageFileTexture();
            mttr.SourceFileName = textureName;
            double factor = 0;
            BlendFactor(out factor);
            MaterialMap map = new MaterialMap(Source.File, textureName, mttr, factor, mapper1);
            MaterialOpacityComponent mdc = new MaterialOpacityComponent(0, map);

            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    Mat.Opacity = mdc;
                }
                tr.Commit();
                return;
            }
        }

        private void
        CreateTextureBumpMaterial(string materialName, string textureName
            )
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Mapper mapper1 = new Mapper(Projection.InheritProjection, Tiling.Tile,
                AutoTransform.TransformObject, Matrix3d.Identity);
            ImageFileTexture mttr = new ImageFileTexture();
            mttr.SourceFileName = textureName;

            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Blend factor:<-1000 - 1000> ");
                if (prNameItem.Status != PromptStatus.OK) return;
                double ItemComp = prNameItem.Value;
                if (ItemComp >= -1000 & ItemComp <= 1000)
                {
                    double factor = (ItemComp + 1000) / 2000;
                    MaterialMap map = new MaterialMap(Source.File, textureName, mttr, factor, mapper1);

                    Transaction tr =
                        Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
                    using (tr)
                    {
                        using (DBDictionary dict = (DBDictionary)tr.GetObject
                        (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                        {
                            ObjectId id = dict.GetAt(materialName);
                            Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                            Mat.Bump = map;
                        }
                        tr.Commit();
                        return;
                    }
                }
            }

        }



        private void
        CreateRefractionMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Refraction index:<1 - 3> ");
                if (prNameItem.Status != PromptStatus.OK) return;
                double ItemComp = prNameItem.Value;
                if (ItemComp >= 1 & ItemComp <= 3)
                {
                    Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
                    using (tr)
                    {
                        using (DBDictionary dict = (DBDictionary)tr.GetObject
                        (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                        {
                            ObjectId id = dict.GetAt(materialName);
                            Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                            MaterialRefractionComponent mdc = new MaterialRefractionComponent(ItemComp, Mat.Refraction.Map);
                            Mat.Refraction = mdc;
                        }
                        tr.Commit();
                        return;
                    }
                }
                ed.WriteMessage(string.Format("\nInvalid data", materialName));
            }
        }



        [CommandMethod("CreateRefractionMaterial", CommandFlags.Modal)]
        public void
        CreateRefractionMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
            CreateRefractionMaterial(matName);
        }

        private void
        CreateSpecularMaterial(string materialName)
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;


            while (true)
            {
                PromptDoubleResult prNameItem = ed.GetDouble
                        ("\n Specular index:<0 - 100> ");
                if (prNameItem.Status != PromptStatus.OK) return;
                double ItemComp = prNameItem.Value;
                if (ItemComp >= 0 & ItemComp <= 100)
                {
                    Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
                    using (tr)
                    {
                        using (DBDictionary dict = (DBDictionary)tr.GetObject
                        (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                        {
                            ObjectId id = dict.GetAt(materialName);
                            Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                            MaterialSpecularComponent mdc = new MaterialSpecularComponent(Mat.Specular.Color,
                                Mat.Specular.Map, ItemComp/100);
                            Mat.Specular = mdc;
                        }
                        tr.Commit();
                        return;
                    }
                }
                ed.WriteMessage(string.Format("\nInvalid data", materialName));
            }
        }

        [CommandMethod("CreateSpecularMaterial", CommandFlags.Modal)]
        public void
        CreateSpecularMaterial()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            string matName = "";
            if (MaterialIdName(m_db, ed, out matName))
                CreateSpecularMaterial(matName);
        }

        private void
        CreateTextureReflectionMaterial(string materialName, string textureName
            )
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Mapper mapper1 = new Mapper(Projection.InheritProjection, Tiling.Tile,
                AutoTransform.TransformObject, Matrix3d.Identity);
            ImageFileTexture mttr = new ImageFileTexture();
            mttr.SourceFileName = textureName;
            double factor = 0;
            BlendFactor(out factor);
            MaterialMap map = new MaterialMap(Source.File, textureName, mttr, factor, mapper1);

            Transaction tr =
                Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction();
            using (tr)
            {
                using (DBDictionary dict = (DBDictionary)tr.GetObject
                (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    ObjectId id = dict.GetAt(materialName);
                    Material Mat = (Material)id.GetObject(OpenMode.ForWrite);
                    Mat.Reflection = map;
                }
                tr.Commit();
                return;
            }
        }

        [CommandMethod("MaterialTextureAdd", CommandFlags.Modal)]
        public void
        AddMaterialDiffuse()
        {
            Database m_db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
        // Задаём имя материала
            PromptStringOptions optString = new PromptStringOptions("\n Name material:");
            optString.AllowSpaces = true;
            PromptResult prName = ed.GetString(optString);
            if (prName.Status != PromptStatus.OK)
                return;
            string matName = prName.StringResult;

            PromptKeywordOptions prOpts = new PromptKeywordOptions("Type texture: ");
            prOpts.Keywords.Add("Diffuse");
            prOpts.Keywords.Add("Opacity");
            prOpts.Keywords.Add("Bump");
            prOpts.Keywords.Add("Reflection");
            prOpts.Keywords.Default = "Diffuse";

            PromptResult prRes = ed.GetKeywords(prOpts);
            if (prRes.Status != PromptStatus.OK)
            {
                return;
            }
            // Задаём текстуру материала
            PromptStringOptions imgString = new PromptStringOptions("\n Name image file: ");
            imgString.AllowSpaces = true;
            PromptResult primg = ed.GetString(imgString);
            if (primg.Status != PromptStatus.OK)
                return;
            string matimg = primg.StringResult;
            ObjectId id;
            if (!hasmaterial(m_db, matName, out id))
            {
                CreateMaterial(matName);
            }
            switch (prRes.StringResult)
            {
                case "Diffuse":
                    CreateTextureDiffuseMaterial(matName, matimg);
                    break;
                case "Opacity":
                    CreateTextureOpacityMaterial(matName, matimg);
                    break;
                case "Bump":
                    CreateTextureBumpMaterial(matName, matimg);
                    break;
                case "Reflection":
                    CreateTextureReflectionMaterial(matName, matimg);
                    break;
                default:
                    return;
            }      
            
        }

    }
}

Последний раз редактировалось Павлюкас, 24.09.2010 в 00:53.
Павлюкас вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Net. Создание и модификация материала

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и модификация материала. Павлюкас Программирование 3 14.11.2007 16:32
Одна из целей: Создание экспертных систем на базе AutoCAD. Сергей Юрьевич Программирование 9 01.01.2005 15:17