326 lines
10 KiB
C++
326 lines
10 KiB
C++
#include "stdafx.h"
|
|
#include "BlockManDlg.h"
|
|
#include "TKWorkspace.h"
|
|
#include "tuanmanage.h"
|
|
#include "gjkworkspace.h"
|
|
extern int DlgContainInsert();
|
|
GEOAPI void MakeVisible(PickSet &ss, bool bTrue);
|
|
|
|
extern int TKW();
|
|
int RepInsert()
|
|
{
|
|
extern BOOL GetFullTkwFile(const TCHAR* szShortFile, CString &csTkwFileName);
|
|
extern BOOL DoReplaceBlock(int nControlFlag, Entity &ent, AcDbObjectId &idBlock);
|
|
RBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL);
|
|
Entity ent;
|
|
if(SelectEntity(_T("\n选择插入的图块<退出>:"), ent, mask)==RTNORM) {
|
|
BOOL bRet=FALSE;
|
|
XDbObject obj(ent, AcDb::kForRead);
|
|
if(!obj)
|
|
return RTERROR;
|
|
AcDbObjectId idBlock;
|
|
AcDbBlockReference *pBlk = AcDbBlockReference::cast(obj.m_pObject);
|
|
if(pBlk)
|
|
idBlock=pBlk->blockTableRecord();
|
|
else {
|
|
TDbMultiViewInsert *pMv = TDbMultiViewInsert::cast(obj.m_pObject);
|
|
idBlock=pMv->GetBlockId(TRUE);
|
|
}
|
|
obj.Close();
|
|
|
|
if(!idBlock.isValid())
|
|
return RTERROR;
|
|
XString sTkw, sTk, sDwg;
|
|
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock);
|
|
if(pBlock) {
|
|
const TCHAR *pComments=NULL;
|
|
if(pBlock->comments(pComments)==Acad::eOk && pComments) {
|
|
CT_strnth(pComments, 1, sTkw);
|
|
CT_strnth(pComments, 2, sTk);
|
|
CT_strnth(pComments, 3, sDwg);
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
|
|
CString csFullTkwFile;
|
|
if(!GetFullTkwFile(sTkw, csFullTkwFile)) {
|
|
sTkw=_T("");
|
|
sTk=_T("");
|
|
sDwg=_T("");
|
|
TKW();
|
|
return RTNORM;
|
|
} else {
|
|
sTk << _T(".tk");
|
|
XPathParser paser1(csFullTkwFile), paser2(sTk);
|
|
if(!paser2.m_sDir)
|
|
paser2.m_sDir=paser1.m_sDir;
|
|
if(!paser2.m_sDrive)
|
|
paser2.m_sDrive=paser1.m_sDrive;
|
|
XString sTkFile;
|
|
sTkFile << paser2.m_sDrive << paser2.m_sDir << paser2.m_sFileName << paser2.m_sExt;
|
|
if(!FindFile(sTkFile)) {
|
|
sTk=_T("");
|
|
sDwg=_T("");
|
|
}
|
|
}
|
|
CTemporaryResourceOverride vTemp;
|
|
CTKWorkspace dlg((const TCHAR *)csFullTkwFile, (const TCHAR *)sTk, (const TCHAR *)sDwg, FALSE);
|
|
if(dlg.DoModal()==IDOK) {
|
|
XString xsTKFile, xsDefaultItem;
|
|
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
|
|
_tsplitpath(dlg.m_csLastTKName, szDrive, szDir, szFile, szExt);
|
|
CString csTmp;
|
|
SplitSlbName(dlg.m_csRet, xsTKFile, xsDefaultItem);
|
|
csTmp.Format(_T("%s%s%s(%s)"), szDrive,szDir,xsTKFile,xsDefaultItem);
|
|
|
|
XString blkName;
|
|
_stprintf(blkName, _T("$%s$%s"), (const TCHAR *)xsTKFile, (const TCHAR *)xsDefaultItem);
|
|
BOOL bNewBlock=!XSymbolTable(_T("BLOCK"), blkName);
|
|
XString sBlock(256);
|
|
if(LoadDwbBlock(csTmp, sBlock)) {
|
|
if(bNewBlock) {
|
|
XDbBlockTableRec rec(sBlock, AcDb::kForWrite);
|
|
if(!!rec) {
|
|
XString sComments(1024); // tkw, tk, block
|
|
sComments << XPathParser(dlg.m_csCurTKWFile).m_sFileName << _T(",")
|
|
<< xsTKFile << _T(",")
|
|
<< (const TCHAR *)xsDefaultItem;
|
|
rec.m_pBlockTableRec->setComments(sComments);
|
|
}
|
|
}
|
|
AcDbObjectId idBlockNew=GetBlockIdFromString(sBlock);
|
|
if(idBlockNew.isValid()) {
|
|
adsout << _T("\n[维持相同插入比例替换(S)/维持相同插入尺寸替换(D)]<退出>:");
|
|
XString sKword;
|
|
int nCode;
|
|
INITGET_BEG(0, _T("S D"));
|
|
nCode=ads_getkword(_T(""), sKword);
|
|
INITGET_END();
|
|
int nFlag=-1;
|
|
if(nCode==RTNORM) {
|
|
if(sKword==_T("S")) nFlag=0;
|
|
else if(sKword==_T("D")) nFlag=LO_FIXDIMENSION_R;
|
|
}
|
|
if(nFlag>=0) {
|
|
if(!DoReplaceBlock(nFlag, ent, idBlockNew))
|
|
adsout << _T("\n不能替换!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
return RTNORM;
|
|
}
|
|
|
|
|
|
//(itkw _T("F:\\tangent\\tarch5\\sys\\1.tkw") T _T("rail(00000001)")) 单选不带入库
|
|
//(itkw _T("F:\\tangent\\tarch5\\sys\\1.tkw") Nil _T("")) 多选带入库
|
|
int CallTKW()
|
|
{
|
|
resbuf *rb=ads_getargs();
|
|
RBList rbArgs=rb;
|
|
int iMode=0;//add by whl
|
|
if(rb && rb->restype==RTSTR) {
|
|
XString xsTKFile, xsDefaultItem;
|
|
BOOL bSelOnly=FALSE;
|
|
if(rb->rbnext && rb->rbnext->restype==RTT)
|
|
bSelOnly=TRUE;
|
|
if(rb->rbnext && rb->rbnext->rbnext) {
|
|
resbuf *rbItem=rb->rbnext->rbnext;
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring) {
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring) {
|
|
SplitSlbName(rbItem->resval.rstring, xsTKFile, xsDefaultItem);
|
|
}
|
|
}
|
|
|
|
//add by whl
|
|
resbuf *rbItem1=rbItem->rbnext;
|
|
if(rbItem1!=NULL&&rbItem1->restype==RTLONG)
|
|
iMode=rbItem1->resval.rlong;
|
|
}
|
|
if(!!xsTKFile)
|
|
xsTKFile << _T(".tk");
|
|
//xsTKFile = XString(_T("%s.tk"), xsTKFile);
|
|
CTemporaryResourceOverride vTemp;
|
|
CTKWorkspace dlg((const TCHAR *)rb->resval.rstring, (const TCHAR *)xsTKFile, (const TCHAR *)xsDefaultItem, !bSelOnly);
|
|
dlg.SetWorkType(iMode);//add by whl
|
|
if(dlg.DoModal()==IDOK) {
|
|
ads_retstr(dlg.m_csRet);
|
|
return RTNORM;
|
|
}
|
|
}
|
|
ads_retnil();
|
|
return RTNORM;
|
|
}
|
|
//add by cwk
|
|
int PatternMgr()
|
|
{
|
|
resbuf *rb=ads_getargs();
|
|
if(rb && rb->restype==RTSTR)
|
|
{
|
|
CPatternManage dlg(rb->resval.rstring);
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
CString sRoot, sKey;
|
|
TCHAR cTemp[256];
|
|
sKey = _T("PATMAN");
|
|
_tcscpy(cTemp, GetRegLocation());
|
|
sRoot = cTemp;
|
|
CRegProperty regProp(sRoot, sKey);
|
|
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
|
CString str;
|
|
regProp.GetValue(_T("PatName"), str);
|
|
ads_retstr(str);
|
|
return RTNORM;
|
|
}
|
|
}
|
|
ads_retnil();
|
|
return RTNONE;
|
|
}
|
|
//add by cwk
|
|
int InvokeGJKW()
|
|
{
|
|
resbuf *rb=ads_getargs();
|
|
RBList rbArgs=rb;
|
|
if(rb && rb->restype==RTSTR)
|
|
{
|
|
XString xsTKFile, xsDefaultItem;
|
|
BOOL bSelOnly=FALSE;
|
|
if(rb->rbnext && rb->rbnext->restype==RTT)
|
|
bSelOnly=TRUE;
|
|
if(rb->rbnext && rb->rbnext->rbnext)
|
|
{
|
|
resbuf *rbItem=rb->rbnext->rbnext;
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring)
|
|
{
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring)
|
|
{
|
|
SplitSlbName(rbItem->resval.rstring, xsTKFile, xsDefaultItem);
|
|
}
|
|
}
|
|
}
|
|
if(!!xsTKFile)
|
|
xsTKFile << _T(".tk");
|
|
CTemporaryResourceOverride vTemp;
|
|
CGJKWorkspace dlg((const TCHAR *)rb->resval.rstring, (const TCHAR *)xsTKFile, (const TCHAR *)xsDefaultItem, bSelOnly);
|
|
if(dlg.DoModal()==IDOK) {
|
|
ads_retstr(dlg.m_csRet);
|
|
return RTNORM;
|
|
}
|
|
}
|
|
ads_retnil();
|
|
return RTNORM;
|
|
}
|
|
int CallTKWnew()
|
|
{
|
|
resbuf *rb=ads_getargs();
|
|
RBList rbArgs=rb;
|
|
if(rb && rb->restype==RTSTR) {
|
|
XString xsTKFile, xsDefaultItem;
|
|
BOOL bSelOnly=FALSE;
|
|
if(rb->rbnext && rb->rbnext->restype==RTT)
|
|
bSelOnly=TRUE;
|
|
if(rb->rbnext && rb->rbnext->rbnext) {
|
|
resbuf *rbItem=rb->rbnext->rbnext;
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring) {
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring) {
|
|
SplitSlbName(rbItem->resval.rstring, xsTKFile, xsDefaultItem);
|
|
}
|
|
}
|
|
}
|
|
if(!!xsTKFile)
|
|
xsTKFile << _T(".tk");
|
|
|
|
CTemporaryResourceOverride vTemp;
|
|
CTKWorkspace dlg((const TCHAR *)rb->resval.rstring, (const TCHAR *)xsTKFile, (const TCHAR *)xsDefaultItem, !bSelOnly);
|
|
if(dlg.DoModal()==IDOK) {
|
|
TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
|
|
_tsplitpath(dlg.m_csLastTKName, szDrive, szDir, szFile, szExt);
|
|
CString csTmp = dlg.m_csRet;
|
|
if(csTmp != _T("")){
|
|
XString xsTKFile, xsDefaultItem;
|
|
SplitSlbName(csTmp, xsTKFile, xsDefaultItem);
|
|
csTmp.Format(_T("%s%s%s%s(%s)"), szDrive,szDir,xsTKFile,szExt,xsDefaultItem);
|
|
}
|
|
ads_retstr(csTmp);
|
|
return RTNORM;
|
|
}
|
|
}
|
|
ads_retnil();
|
|
return RTNORM;
|
|
}
|
|
|
|
//(IBlkman _T("e:\\tangent\\tarch5\\dwb\\rail.tk") T _T("rail(00000001)")) 单选不带入库
|
|
//(IBlkman _T("e:\\tangent\\tarch5\\dwb\\rail.tk") nil _T("rail(00000001)")) 带入库
|
|
// 用adsinvoke调用
|
|
int CallBlkMgr()
|
|
{
|
|
resbuf *rb=ads_getargs();
|
|
RBList rbArgs=rb;
|
|
if(rb && rb->restype==RTSTR) {
|
|
BOOL bSelOnly=FALSE;
|
|
if(rb->rbnext && rb->rbnext->restype==RTT)
|
|
bSelOnly=TRUE;
|
|
XString sDefaultItem;
|
|
if(rb->rbnext && rb->rbnext->rbnext) {
|
|
resbuf *rbItem=rb->rbnext->rbnext;
|
|
if(rbItem->restype==RTSTR && rbItem->resval.rstring) {
|
|
SplitSlbName(rbItem->resval.rstring, XString(), sDefaultItem);
|
|
}
|
|
}
|
|
|
|
CBlockManDlg dlg(rb->resval.rstring, bSelOnly? 2 : 1, sDefaultItem);
|
|
if(dlg.m_bInitReady) {
|
|
XString sBlockName;
|
|
CTemporaryResourceOverride vTemp;
|
|
if(dlg.DoModal()==IDOK && dlg.GetBlockName(sBlockName)) {
|
|
ads_retstr(sBlockName);
|
|
return RTNORM;
|
|
}
|
|
}
|
|
}
|
|
ads_retnil();
|
|
return RTNORM;
|
|
}
|
|
|
|
int ProcessBlockInsert(PickSet &ss)
|
|
{
|
|
PickSet ssInsert(SS_FREE);
|
|
ssInsert += ss;
|
|
ssInsert.BaseFilter(RBList(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL));
|
|
if(ssInsert.Length()) {
|
|
int nRetCode=DlgContainInsert();
|
|
if(nRetCode==0)
|
|
return RTCAN;
|
|
if(nRetCode==2) {
|
|
long lCount=ssInsert.Length();
|
|
for(long idx=0L; idx<lCount; idx++) {
|
|
Entity ent=ssInsert[idx];
|
|
if(ent.Is(_T("INSERT"))) {
|
|
PickSet ssUnit(SS_FREE);
|
|
ssUnit.IncludeBegin();
|
|
SHads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent, RTNONE);
|
|
ssUnit.IncludeEnd();
|
|
ss += ssUnit;
|
|
} else if(ent.Is(_T("AEC_BLOCK_INSERT")) || ent.Is(_T("ATS_MVINSERT"))) {
|
|
PickSet ssTemp(SS_FREE);
|
|
ssTemp.IncludeBegin();
|
|
SHads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent, RTNONE);
|
|
ssTemp.IncludeEnd();
|
|
ASSERT(ssTemp.Length()==1);
|
|
Entity ent1=ssTemp[0L];
|
|
PickSet ssUnit(SS_FREE);
|
|
ssUnit.IncludeBegin();
|
|
SHads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent1, RTNONE);
|
|
ssUnit.IncludeEnd();
|
|
ss += ssUnit;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return RTNORM;
|
|
}
|
|
|