天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 54|回复: 0

ObjectARX2015 + vs2012多线样式字典

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]1. 说明

        多线在用于创建一组直线时特别有用,例如绘制建筑平面图时的墙线和轴线就可以用一条多线来表示。在创建程序时,某些情况下就有必要创建新的多线样式,本节的实例演示多线样式的创建和删除。
2. 思路
        多线样式在图形数据库中同样是通过有名对象字典保存,其对应的是有名对象字典中的“ACAD_MLINESTYLE ”字典。除了 AcDbMlineStyle 对象的创建,使用有名对象字典保存多线样式的方法与创建组类似,因此这里把注意力放在 AcDbMlineStyle 对象的创建方面。
        要创建一个 AcDbMlineStyle 对象(多线样式),至少需要下面的四个步骤:
        (1 )创建新的对象,并且用指针指向分配的内存空间:
                                AcDbMlineStyle *pMlStyle = new AcDbMlineStyle;
        (2)使用 initMlineStyle 函数初始化多线样式。
        (3)使用 setName 函数设置多线样式的名称。
        (4)使用 addElement 函数添加新的元素,该函数被定义为:
Acad::ErrorStatus addElement(
    int& index,              //index 返回从0开始的元素索引
    double offset,           //offset 指定添加的元素的偏移量
    const AcCmColor & color, //color 指定元素的颜色
    AcDbObjectId linetypeId, //linetypeId 指定添加元素的线型
    bool checkIfReferenced = true);//checkIfReferenced 在帮助文档中并未说明其含义,可以不必考虑
        此外,还可以使用 AcDbMlineStyle 类的其他成员函数对多线样式进行修改,例如 setElement 函数用于修改元素的样式, setFillColor 函数用于设置多线内部的填充颜色。
3. 步骤
(1) 添加一个新的多线样式
        由于在向多线样式添加元素时需要指定其线型,因此首先要加载用到的两个线型,使用全局函数 acdbLoadLineTypeFile 或者 AcDbDatabase 类的 loadLineTypeFile 函数均可以完成线型的加载。
    // 添加一个新的多线样式
    static void AddMlineStyle();// 添加一个新的多线样式
    // 根据输入的线型名称获得其 ObjectId
    static Acad::ErrorStatus GetLinetypeId(const TCHAR *linetype, AcDbObjectId &linetypeId); // 根据输入的线型名称获得其 ObjectId
// 添加一个新的多线样式
void CXData::AddMlineStyle()
{
    // 加载线型(两种方法)
    Acad::ErrorStatus es;
    es = acdbHostApplicationServices()->workingDatabase()->loadLineTypeFile(_T("CENTER"), _T("acadiso.lin"));
    es = acdbLoadLineTypeFile(_T("HIDDEN"), _T("acadiso.lin"), acdbHostApplicationServices()->workingDatabase());
   
    // 创建新的AcDbMlineStyle对象
    AcDbMlineStyle *pMlStyle = new AcDbMlineStyle;
    pMlStyle->initMlineStyle();
    pMlStyle->setName(_T("NewStyle"));

    int index; // 多线样式中的元素索引
    AcCmColor color; // 颜色
    AcDbObjectId linetypeId; // 线型的ID
   
    // 添加第一个元素(红色的中心线)
    color.setColorIndex(1); // 红色
    GetLinetypeId(_T("CENTER"), linetypeId);
    pMlStyle->addElement(index, 0, color, linetypeId);
   
    // 添加第二个元素(蓝色的虚线)
    color.setColorIndex(5); // 蓝色
    GetLinetypeId(_T("HIDDEN"), linetypeId);
    pMlStyle->addElement(index, 0.5, color, linetypeId);
   
    // 添加第三个元素(蓝色的虚线)
    pMlStyle->addElement(index, -0.5, color, linetypeId);
   
    // 将多线样式添加到多线样式字典中
    AcDbDictionary *pDict;
    acdbHostApplicationServices()->workingDatabase()->getMLStyleDictionary(pDict, AcDb::kForWrite);
    AcDbObjectId mlStyleId;
    es = pDict->setAt(_T("NewStyle"), pMlStyle, mlStyleId);
    pDict->close();
    pMlStyle->close();
}


// 根据输入的线型名称获得其 ObjectId
Acad::ErrorStatus CXData::GetLinetypeId(const TCHAR *linetype, AcDbObjectId &linetypeId)
{
    AcDbLinetypeTable *pLtpTbl;
    acdbHostApplicationServices()->workingDatabase()->getLinetypeTable(pLtpTbl, AcDb::kForRead);

    if (!pLtpTbl->has(linetype))
    {
        pLtpTbl->close();
        return Acad::eBadLinetypeName;
    }

    pLtpTbl->getAt(linetype, linetypeId);
    pLtpTbl->close();

    return Acad::eOk;
}
(2)  用于删除 AddMlStyle 命令创建的多线样式

    // 用于删除 AddMlStyle 命令创建的多线样式
    static void DelMlineStyle(); // 用于删除 AddMlStyle 命令创建的多线样式
// 用于删除 AddMlStyle 命令创建的多线样式
void CXData::DelMlineStyle()
{
    // 获得多线样式字典
    AcDbDictionary *pDict;
    acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pDict, AcDb::kForWrite);

    if (pDict->has(_T("NewStyle")))
    {
        pDict->remove(_T("NewStyle"));
    }
    pDict->close();
}
(3) 在acrxEntryPoint.cpp中
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyAddMlineStyle, MyAddMlineStyle, ACRX_CMD_MODAL, NULL) //添加多线样式
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDelMlineStyle, MyDelMlineStyle, ACRX_CMD_MODAL, NULL) //删除多线样式
    //当前项目中注册命令 AddMlineStyle(添加多线样式)
        static void MidasMyGroupMyAddMlineStyle()
    {
        CXData::AddMlineStyle();
    }

    //当前项目中注册命令 DelMlineStyle(删除多线样式)
    static void MidasMyGroupMyDelMlineStyle()
    {
        CXData::DelMlineStyle();
    }
[/code]

 

 

 

 

ObjectARX2015 + vs2012多线样式字典
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:30 , Processed in 0.146383 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表