Тема: Создание материала в базе и присвоение ему текстуры из файла картинки
Как это сделать?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Создание материала в базе и присвоение ему текстуры из файла картинки
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как это сделать?
> Павлюкас
В какой версии AutoCAD?
> Александр Ривилис
Да. Это то что надо. Я в принципе вчера это уже набросал здесь https://www.caduser.ru/forum/topic38859.html
но не знаю как прицепить текстуру из .jpg файла который лежит в определённой папке.
В примерах этого не нашёл.
> Павлюкас
А здесь?
> Александр Ривилис
Просто низкий поклон за помощь.
А аналог CMatLib::addMaterial для С# не подскажите?
А аналог CMatLib::addMaterial для С# не подскажите?
Так он же во второй ссылке (только не указано, что он член класса CMatLib)
Упс. :( Не посмотрел что речь идет о C#. Не уверен, что для всех классов есть обертки в .NET и нет времени проверять...
> Александр Ривилис
Во что получилось
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;
Ага. Вроде получается, но через функции
MaterialMap map = new MaterialMap(Source.File, textureName, mttr, 1, mapper1);
и т.д.
Интересно, почему нельзя как так
MaterialMap map; //map.Source = Source.File; //map.SourceFileName = materialName; //map.BlendFactor = 1;
?
> Павлюкас
Потому что так господа из Autodesk сделали.
> Александр Ривилис
Интересная штука получается
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)
и не выдаёт если имя материала уже есть в словаре.
Подскажите, в чём может быть проблема?
Вопрос уже не актуален.
Добавил
if (dict.Contains(matname)) id = dict.GetAt(matname);
Однако очень странно, что выбрасывает с ошибкой
> Павлюкас
Ничего странного. Она тебе явно указывает, что eKeyNotFound (т.е. нет в словаре).
> Александр Ривилис
Вот что у меня получилось, но материал всё равно не присваивается зараза.
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"); } } }
Почему? Не понимаю. Всё вроде сделал как в примерах
Естесственно. Материал sky.tga находится в папке Texture и путь к ней прописан в настройках AutoCAD'а "Textures Maps Search Path"
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Создание материала в базе и присвоение ему текстуры из файла картинки
Форум работает на PunBB, при поддержке Informer Technologies, Inc