Тема: Создание материала в базе и присвоение ему текстуры из файла картинки

Как это сделать?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Павлюкас
В какой версии AutoCAD?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Для 2007 и 2008 посмотри здесь, здесь и здесь.

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Александр Ривилис
Да. Это то что надо. Я в принципе вчера это уже набросал здесь https://www.caduser.ru/forum/topic38859.html
но не знаю как прицепить текстуру из .jpg файла который лежит в определённой папке.
В примерах этого не нашёл.

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Павлюкас
А здесь?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Александр Ривилис
Просто низкий поклон за помощь.
А аналог CMatLib::addMaterial для С# не подскажите?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Павлюкас пишет:

А аналог CMatLib::addMaterial для С# не подскажите?

Так он же во второй ссылке (только не указано, что он член класса CMatLib)

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Упс. :( Не посмотрел что речь идет о C#. Не уверен, что для всех классов есть обертки в .NET и нет времени проверять...

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Александр Ривилис
Во что получилось

private void
        CreateTextureMaterial(string materialName, string textureName)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database m_db = doc.Database;
            Editor ed = doc.Editor;
            Transaction tr = doc.TransactionManager.StartTransaction();
            using (tr)
            {
                MaterialMap map;
                //map.Source = Source.File;
                //map.SourceFileName = materialName;
                //map.BlendFactor = 1;
                MaterialColor mc;
                //mc.Method = Method.Override;
                mc.Factor =1;
                Material MAT = new Material();
                MAT.Name = materialName;
                MAT.Description = "New Material";
                MaterialDiffuseComponent mdc;
                //mdc.Map = map;
                MAT.Diffuse = mdc;
             ......

Все закомментированные строки выдают
Property or indexer 'AutoDesk.AutoCAD.GraphicsInterface.MaterialMap.Source' cannot be assigned to -- it is read only;

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Ага. Вроде получается, но через функции
MaterialMap map = new MaterialMap(Source.File, textureName, mttr, 1, mapper1);
и т.д.
Интересно, почему нельзя как так

MaterialMap map;
                //map.Source = Source.File;
                //map.SourceFileName = materialName;
                //map.BlendFactor = 1;

?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Павлюкас
Потому что так господа из Autodesk сделали. smile

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Александр Ривилис
Интересная штука получается

private bool hasmaterial(Database m_db, string matname, out ObjectId id)
        {
            bool bexist = false;
            id = ObjectId.Null;
            using (TransactionHelper tr = new TransactionHelper(m_db))
            {
                tr.Start();
                using (DBDictionary dict = (DBDictionary)tr.Transaction.GetObject
                    (m_db.MaterialDictionaryId, OpenMode.ForRead))
                {
                    id = dict.GetAt(matname);
                    if (!id.IsNull)
                    {
                        bexist = true;
                    }
                }
                tr.Commit();
                return bexist;
            }
        }

выдаёт ошибку
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Autodesk.AutoCAD.Runtime.Exception: eKeyNotFound
   at Autodesk.AutoCAD.DatabaseServices.DBDictionary.GetAt(String entryName)

и не выдаёт если имя материала уже есть в словаре.
Подскажите, в чём может быть проблема?

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Вопрос уже не актуален.
Добавил

if (dict.Contains(matname))
id = dict.GetAt(matname);

Однако очень странно, что выбрасывает с ошибкой

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Павлюкас
Ничего странного. Она тебе явно указывает, что eKeyNotFound (т.е. нет в словаре).

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

> Александр Ривилис
Вот что у меня получилось, но материал всё равно не присваивается зараза.

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 UtilPav;
[assembly: CommandClass(typeof(MPavel.MaterialObjectId))]
namespace MPavel
{
    class MaterialObjectId
    {
        public
        MaterialObjectId()
        {
        }
        private bool hasmaterial(Database m_db, string matname, out ObjectId id)
        {
            bool bexist = false;
            id = ObjectId.Null;
            using (TransactionHelper tr = new TransactionHelper(m_db))
            {
                tr.Start();
                using (DBDictionary dict = (DBDictionary)tr.Transaction.GetObject
                    (m_db.MaterialDictionaryId, OpenMode.ForRead))
                {
                    if (dict.Contains(matname))
                    id = dict.GetAt(matname);
                    if (!id.IsNull)
                    {
                        bexist = true;
                    }
                }
                tr.Commit();
                return bexist;
            }
        }
        private bool addMaterial(Database m_db, Material Mat, out ObjectId idm)
        {
            ObjectId id;
            idm= ObjectId.Null;
            if (hasmaterial(m_db, Mat.Name, out id))
                return true;
            using (TransactionHelper tr = new TransactionHelper(m_db))
            {
                tr.Start();
                using (DBDictionary dict = (DBDictionary)tr.Transaction.GetObject
                    (m_db.MaterialDictionaryId, OpenMode.ForWrite))
                {
                    idm = dict.SetAt(Mat.Name, Mat);
                    tr.Transaction.AddNewlyCreatedDBObject(idm.GetObject(OpenMode.ForRead), true);
                }
                tr.Commit();
                return true;
            }
        }
        private void
        CreateTextureMaterial(string materialName, string textureName)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database m_db = doc.Database;
            Editor ed = doc.Editor;
            Mapper mapper1 = new Mapper();
            MaterialTexture mttr = new MaterialTexture();
            //WoodTexture mttr = new WoodTexture();
            MaterialMap map = new MaterialMap(Source.File, textureName, mttr, 1, mapper1);
            EntityColor eclr = new EntityColor(150, 150, 150);
            MaterialColor mc = new MaterialColor(Method.Override, 1, eclr);
            MaterialDiffuseComponent mdc = new MaterialDiffuseComponent(mc, map);
            MaterialSpecularComponent mck = new MaterialSpecularComponent(mc, map, 0.5);
            MaterialOpacityComponent moc = new MaterialOpacityComponent(1, map);
            MaterialRefractionComponent mrfr = new MaterialRefractionComponent(2, map);
            Material Mat = new Material();
            Mat.Name = materialName;
            Mat.Description = "New Material";
            Mat.Diffuse = mdc;
            Mat.Specular = mck;
            Mat.Refraction = mrfr;
            Mat.Reflectivity = 1;
            Mat.Reflection = map;
            Mat.Opacity = moc;
            Mat.Ambient = mc;
            Mat.Bump = map;
            Mat.SelfIllumination = 1;
            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;
            CreateTextureMaterial(matName, "sky.tga");
        }
    }
}

Почему? Не понимаю. Всё вроде сделал как в примерах

Re: Создание материала в базе и присвоение ему текстуры из файла картинки

Естесственно. Материал sky.tga находится в папке Texture и путь к ней прописан в настройках AutoCAD'а "Textures Maps Search Path"