pengyh 发表于 2006-6-2 23:49:00

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

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

jingelou 发表于 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;
   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;
    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;
}

wzz1968 发表于 2006-6-14 17:19:00

上述代码有点太复杂啦
用acedCommand函数调用AUTOCAD的style命令就可以实现.

easypower 发表于 2006-6-17 10:06:00


就是要用复杂的代码,呵呵,用二楼的代码才是真正和cad的内核打交道,用acedCommand还不如用 lisp,不用编译,二楼的是正解

HuaiYu 发表于 2006-6-17 17:53:00

同意,既然是程序就要用编程的思想

wzz1968 发表于 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 410.5) (assoc 41ent_list))
   (entmake ent)
)
)
对于初学者,那段代码好理解是不言而语的.

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

pglyxq 发表于 2006-6-23 17:36:00

ARX任何方面的代码都足以使初学者望而却步,如果害怕,就不要去碰ARX。刚从LISP转ARX的人的最大安慰就是有acedCommand()函数,但那只是古老的ADS遗留下来的ADSRX,从面向对象的角度而言,要真正掌握ARX,就要彻底放弃LISP的思维方式。
所以这些LISP代码对于ARX而言没有任何价值!
//
页: [1]
查看完整版本: 请教如何通过程序实现在类似AutoCAD中添加一中字体样式的功能?