明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3847|回复: 6

请教如何通过程序实现在类似AutoCAD中添加一中字体样式的功能?

[复制链接]
发表于 2006-6-2 23:49:00 | 显示全部楼层 |阅读模式

如题,我需要通过程序实现类似AutoCAD中添加一中字体样式的功能?这样我可以将这个字体样式一直保存,然后每次我添加文字的时候都可以用啦,望大虾们不吝赐教!

发表于 2006-6-14 00:41:00 | 显示全部楼层


AcDbObjectId CLjDwg::AddTextStyle(const char* strName,
          const char* strStype,
          const char* strBigName,
          const double dHeight,
          const double dFactor,
          AcDbDatabase* pDb)
{
 AcDbObjectId idTextStyle=NULL;

 AcDbTextStyleTable *pTable=NULL; 
 AcDbTextStyleTableRecord *pTableRecord; 
 if (pDb==NULL)
  pDb=acdbCurDwg();
 pDb->getTextStyleTable(pTable,AcDb::kForWrite);

 if(pTable==NULL)
 {
  AfxMessageBox("Fonttable open wrong");
  return idTextStyle;
 }
 // 生成新的图层表记录 
 Acad::ErrorStatus es;
 pTable->getAt(ACDB_MODEL_SPACE,pTableRecord,AcDb::kForWrite);
 if(pTable->has(strName))
 {
  pTable->getAt(strName,idTextStyle);
 }
 else
 {
  pTableRecord=new AcDbTextStyleTableRecord;  
  es = pTableRecord->setName(strName); 

  if(CString(strStype).Find(_T(".shx")) != -1
   || CString(strStype).Find(_T(".SHX")) != -1)
  {
   char szPath[MAX_PATH];
   if (ads_findfile(strStype,szPath) != RTNORM)
   {
    ads_printf("Could not find file %s.\n", strStype);
   }
   else
   {
    es = pTableRecord->setFileName(strStype);
   }   
   if(CString(strBigName) != _T(""))
   {
    char szPath[MAX_PATH];
    if (ads_findfile(strBigName,szPath) != RTNORM)
    {
     ads_printf("Could not find file %s.\n", strBigName);
    }
    else
    {
     es = pTableRecord->setBigFontFileName(strBigName);
    }
   }
  }
  else
  {
   es = pTableRecord->setFont(strStype,FALSE,FALSE,200,100);
  }

  pTableRecord->setTextSize(dHeight);
  pTableRecord->setXScale(dFactor);  
  es = pTable->add(idTextStyle,pTableRecord); 
  pTableRecord->close(); 
 } 

 pTable->close();

 return idTextStyle;
}

 

评分

参与人数 1金钱 +5 贡献 +1 激情 +1 收起 理由
easypower + 5 + 1 + 1 【精华】设置字体样式

查看全部评分

发表于 2006-6-14 17:19:00 | 显示全部楼层

上述代码有点太复杂啦

用acedCommand函数调用AUTOCAD的style命令就可以实现.

 

发表于 2006-6-17 10:06:00 | 显示全部楼层
wzz1968发表于2006-6-14 17:19:00 上述代码有点太复杂啦 用acedCommand函数调用AUTOCAD的style命令就可以实现.
就是要用复杂的代码,呵呵,用二楼的代码才是真正和cad的内核打交道,用acedCommand还不如用 lisp,不用编译,二楼的是正解
发表于 2006-6-17 17:53:00 | 显示全部楼层
同意,既然是程序就要用编程的思想
发表于 2006-6-23 15:15:00 | 显示全部楼层

初学编程的非常忌讳搞一对找不着边的代码,二楼的代码足以使初学者望而却步.

当然可以用LISP解决问题.

方式如下:

假设定义HS字型

1.用command函数

(if  (= (tblsearch "style" "hs") nil)

     (command  "style" "hs" "txt,hs" "4" "0.5" "" "" "")

)

2.用tblobjname函数

(if  (= (tblsearch "style" "hs") nil)

 (progn 

    (setq ent (tblobjname "style" "standard"))

     (setq ent_list (entget ent))

     (setq ent_list (subst (cons 2 "hs") (assoc 2 ent_list))

     (setq ent_list (subst (cons 3 "txt") (assoc 3 ent_list))

     (setq ent_list (subst (cons 4 "hs") (assoc 4 ent_list))

     (setq ent_list (subst (cons 40   4.0) (assoc 40 ent_list))

     (setq ent_list (subst (cons 41  0.5) (assoc 41  ent_list))

     (entmake ent)

)

)

对于初学者,那段代码好理解是不言而语的.

 

     (command  "style" "hs" "txt,hs" "4" "0.5" "" "" "")

)

发表于 2006-6-23 17:36:00 | 显示全部楼层
wzz1968发表于2006-6-23 15:15:00 初学编程的非常忌讳搞一对找不着边的代码,二楼的代码足以使初学者望而却步. 当然可以用LISP解决问题. 方式如下:

ARX任何方面的代码都足以使初学者望而却步,如果害怕,就不要去碰ARX。刚从LISP转ARX的人的最大安慰就是有acedCommand()函数,但那只是古老的ADS遗留下来的ADSRX,从面向对象的角度而言,要真正掌握ARX,就要彻底放弃LISP的思维方式。

所以这些LISP代码对于ARX而言没有任何价值!

//

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 23:35 , Processed in 0.179413 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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