1467 lines
35 KiB
C++
1467 lines
35 KiB
C++
#include "StdAfx.h"
|
|
#include "LeaderTextDlg.h"
|
|
#include "TLeaderAddOtherPtJig.h"
|
|
#include "LeaderEdjig.h"
|
|
|
|
#include "AcEdInputPointMonitorEx.h"
|
|
|
|
// 获得端点在pt点的管子
|
|
bool GetPipe(XPoint &pt, PickSet &ss)
|
|
{
|
|
const double dDist = 1;
|
|
AcGePoint3d ptGeLB ,ptGeLT, ptGeRB, ptGeRT;
|
|
AcGeVector3d vtX = AcGeVector3d::kXAxis;
|
|
AcGeVector3d vtY = AcGeVector3d::kYAxis;
|
|
ptGeLB = pt - vtX * dDist / 2;
|
|
ptGeLB = ptGeLB - vtY * dDist / 2;
|
|
ptGeLT = ptGeLB + vtY * dDist;
|
|
ptGeRB = ptGeLB + vtX * dDist;
|
|
ptGeRT = ptGeRB + vtY * dDist;
|
|
|
|
PickSet ssSel(SS_FREE);
|
|
RBList rbFilter(RTDXF0, _T("ATS_PIPE"), NULL);
|
|
|
|
TADSGePoint3d _pt1 = Wcs2Ucs(ptGeLB)
|
|
, _pt2 = Wcs2Ucs(ptGeLT)
|
|
, _pt3 = Wcs2Ucs(ptGeRT)
|
|
, _pt4 = Wcs2Ucs(ptGeRB);
|
|
RBList rbPt = acutBuildList(RTPOINT,&_pt1,RTPOINT,&_pt2,RTPOINT,&_pt3, RTPOINT,&_pt4,NULL);
|
|
acedSSGet(_T("CP"),rbPt,NULL,rbFilter,ssSel);
|
|
|
|
PickSet ss2(SS_FREE);
|
|
double dDistToPt = 0.0;
|
|
XPoint ptOnPipe;
|
|
for (long i = 0; i < ssSel.Length(); i++)
|
|
{
|
|
OPENOBJ_BEGIN(ssSel[i], AcDb::kForRead, TDbPipe, pPipe);
|
|
if (pPipe != NULL)
|
|
{
|
|
pPipe->getClosestPointTo(pt, ptOnPipe);
|
|
dDistToPt = pt.Distance2d(ptOnPipe);
|
|
if (dDistToPt < 1e-3)
|
|
{
|
|
ss2 += ssSel[i];
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
ss += ss2;
|
|
if (ss.Length() >0 )
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void LeaderTextDim()
|
|
{
|
|
CTemporaryResourceOverride vTemp;
|
|
CLeaderTextDlg *pDlg = NULL;
|
|
AcDbObjectId idTextStyle = InitTextStyle(TS_DIM);
|
|
if (!idTextStyle)
|
|
return;
|
|
pDlg->g_sFontStyle = (const TCHAR *)GetSymbolName(idTextStyle);
|
|
|
|
if (pDlg == NULL)
|
|
{
|
|
pDlg = new CLeaderTextDlg;
|
|
pDlg->Create(IDD_LEADER_TEXT);
|
|
}
|
|
pDlg->ShowWindow(SW_SHOW);
|
|
acedGetAcadDwgView()->SetFocus();
|
|
|
|
TDbSymbMultiLeader ent;
|
|
ent.SetLayoutRotation(Ucs2Wcs(0.0));
|
|
ent.SetTextLayerId(InitLayer(LAY_TEXT, TRUE));
|
|
ent.SetTextBaseLen(ent.GetDefaultTextBaseLen());
|
|
|
|
XPoint ptFirst;
|
|
TDbSymbMultiLeader::TArrowStyle ar = TDbSymbMultiLeader::kNone;
|
|
while(ads_getpoint(NULL, _T("\n请给出标注第一点<退出>: "), ptFirst) == RTNORM)
|
|
{
|
|
PickSet ssAll(SS_FREE);
|
|
XPoint ptPiont = Ucs2Wcs(ptFirst);
|
|
if(GetPipe(ptPiont, ssAll))//搜索第一点附近的管线
|
|
{
|
|
Entity entPipe;
|
|
TCHAR szLayer[256];
|
|
entPipe = ssAll[0L];
|
|
entPipe.GetData(8, szLayer);
|
|
pDlg->m_sLayer = szLayer;
|
|
pDlg->SetCmbSysStyle();
|
|
pDlg->OnSysStyleSet();
|
|
}
|
|
|
|
pDlg->UpdateData();
|
|
XPointList lstVertexes;
|
|
lstVertexes.Append(new XPoint(Ucs2Wcs(ptFirst)));
|
|
ent.SetLeaderVertexes(lstVertexes);
|
|
pDlg->DlgToObj(&ent);
|
|
pDlg->m_bPost = TRUE;
|
|
|
|
TLeaderEdJig jig(&ent);
|
|
jig.SetOperCode(TLeaderEdJig::kLeader);
|
|
|
|
int nRet = RTNORM;
|
|
while(1)
|
|
{
|
|
if(!pDlg->IsWindowVisible())
|
|
{
|
|
pDlg->DestroyWindow();
|
|
delete pDlg;
|
|
return;
|
|
}
|
|
jig.SetPrompt(_T("\n输入引线位置或 [更改箭头型式(A)]<退出>: "));
|
|
jig.SetKeyword(_T("` A"));
|
|
jig.setUserInputControls(AcEdJig::kNullResponseAccepted);
|
|
|
|
int kwd(0);
|
|
nRet = jig.DoIt(&kwd);
|
|
|
|
if (nRet == RTNORM)
|
|
break;
|
|
else if (nRet == RTKWORD)
|
|
{
|
|
if (kwd == 0)
|
|
{
|
|
if (pDlg->m_bGetText)
|
|
{
|
|
pDlg->GetPickText();
|
|
pDlg->m_bGetText = FALSE;
|
|
}
|
|
pDlg->DlgToObj(&ent);
|
|
}
|
|
if (kwd != 0)
|
|
{
|
|
if (ar == TDbSymbMultiLeader::kNone)
|
|
ar = TDbSymbMultiLeader::kDote;
|
|
else if (ar == TDbSymbMultiLeader::kDote)
|
|
ar = TDbSymbMultiLeader::kArrow;
|
|
else if (ar == TDbSymbMultiLeader::kArrow)
|
|
ar = TDbSymbMultiLeader::kCrossing;
|
|
else
|
|
ar = TDbSymbMultiLeader::kNone;
|
|
ent.SetArrow(ar);
|
|
}
|
|
}
|
|
}
|
|
|
|
jig.SetKeyword(_T("`"));
|
|
jig.SetOperCode(TLeaderEdJig::kTextLine);
|
|
|
|
while(1)
|
|
{
|
|
if(!pDlg->IsWindowVisible())
|
|
{
|
|
pDlg->DestroyWindow();
|
|
delete pDlg;
|
|
return;
|
|
}
|
|
|
|
jig.SetPrompt(_T("\n点取文字基线位置<退出>: "));
|
|
nRet = jig.DoIt();
|
|
|
|
if (nRet == RTNORM)
|
|
break;
|
|
else if (nRet == RTKWORD)
|
|
{
|
|
if (pDlg->m_bPost)
|
|
{
|
|
if (pDlg->m_bGetText)
|
|
{
|
|
pDlg->GetPickText();
|
|
pDlg->m_bGetText = FALSE;
|
|
}
|
|
pDlg->DlgToObj(&ent);
|
|
}
|
|
}
|
|
}
|
|
|
|
AcDbObjectId newId = ((TDbEntity *)ent.clone())->AddToCSpace(Adesk::kTrue);
|
|
|
|
OPENOBJ_BEGIN(newId, AcDb::kForWrite, TDbSymbMultiLeader, pLeader);
|
|
pLeader->setLayer(InitLayer(pDlg->m_sDimLayer));//设置标注图层
|
|
OPENOBJ_END();
|
|
|
|
if (pDlg->g_bLeadLine) //引出多线
|
|
{
|
|
OPENOBJ_BEGIN(newId, AcDb::kForRead, TDbSymbMultiLeader, pLeader);
|
|
|
|
if (pLeader != NULL)
|
|
{
|
|
XPoint ptBase = pLeader->GetLeaderPoint();
|
|
while (1)
|
|
{
|
|
XPoint ptAdd;
|
|
TLeaderAddOtherPtJig jig2(&*pDlg, Ucs2Wcs(ptFirst), ptBase);
|
|
jig2.SetPrompt(_T("\n输入其他的标注点<结束>: "));
|
|
jig2.SetKeyword(_T("`"));
|
|
|
|
nRet = jig2.DoIt();
|
|
|
|
if(!pDlg->IsWindowVisible())
|
|
{
|
|
pDlg->DestroyWindow();
|
|
if (pDlg != NULL)
|
|
{
|
|
delete pDlg;
|
|
pDlg = NULL;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (nRet == RTNORM)
|
|
{
|
|
ptAdd = jig2.GetPickPoint();
|
|
|
|
XPointList pts;
|
|
pLeader->GetLeaderVertexes(pts);
|
|
pts.Append(new XPoint(ptAdd));
|
|
|
|
if (pLeader->upgradeOpen() == Acad::eOk)
|
|
{
|
|
pLeader->SetLeaderVertexes(pts);
|
|
pLeader->downgradeOpen();
|
|
}
|
|
}
|
|
else if (nRet == RTNONE)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
pDlg->AddToRecent();
|
|
pDlg->m_bPost = FALSE;
|
|
}
|
|
pDlg->DestroyWindow();
|
|
delete pDlg;
|
|
}
|
|
|
|
|
|
// 工具条升级标准
|
|
bool UpdateText(CString &sCmd)
|
|
{
|
|
if (sCmd.Compare(_T("T88")) == 0)// twt
|
|
{
|
|
sCmd = _T("T98");
|
|
}
|
|
else if (sCmd.Compare(_T("T86")) == 0) // tch
|
|
{
|
|
sCmd = _T("T96");
|
|
}
|
|
else if (sCmd.Compare(_T("T83")) == 0)// th
|
|
{
|
|
sCmd = _T("T93");
|
|
}
|
|
else if (sCmd.Compare(_T("t88")) == 0)// twt
|
|
{
|
|
sCmd = _T("t98");
|
|
}
|
|
else if (sCmd.Compare(_T("t86")) == 0) // tch
|
|
{
|
|
sCmd = _T("t96");
|
|
}
|
|
else if (sCmd.Compare(_T("t83")) == 0)// th
|
|
{
|
|
sCmd = _T("t93");
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// 升级acad.pgp文件
|
|
void UpdateAcad()
|
|
{
|
|
XString fullFile, fullFile2;
|
|
if(!FindFile(_T("acad.pgp"), fullFile))
|
|
{
|
|
AfxMessageBox(_T("acad.pgp文件错误!"));
|
|
return;
|
|
}
|
|
|
|
FILE *pFile = fopen(_AS(fullFile), "r");
|
|
CString sOldText = fullFile.cs();
|
|
int n = sOldText.ReverseFind('\\');
|
|
CString sText = sOldText.Left(n + 1);
|
|
fullFile2 = sText + _T("acadCopy.pgp");
|
|
|
|
FILE *pFileCopy = fopen(_AS(fullFile2), "w");
|
|
|
|
if(!pFile || !pFileCopy)
|
|
{
|
|
return;
|
|
}
|
|
while(!feof(pFile))
|
|
{
|
|
char sBuf[256]="";
|
|
fgets(sBuf, 255, pFile);
|
|
CString csTmp = sBuf;
|
|
csTmp.TrimRight();
|
|
int iIndex = csTmp.Find(_T("_"));
|
|
if(iIndex > 0)
|
|
{
|
|
CString sCmdLeft = csTmp.Left(iIndex);
|
|
CString sCmdRight = csTmp.Right(csTmp.GetLength() - iIndex);
|
|
CString sCmd = sCmdLeft.Right(3);
|
|
UpdateText(sCmd);
|
|
sCmdLeft = sCmdLeft.Left(sCmdLeft.GetLength() - 3);
|
|
csTmp = sCmdLeft + sCmd + sCmdRight;
|
|
}
|
|
csTmp +=_T("\n");
|
|
fputs(_AS(csTmp), pFileCopy);
|
|
}
|
|
fclose(pFile);
|
|
fclose(pFileCopy);
|
|
|
|
remove(_AS(fullFile));
|
|
rename(_AS(fullFile2), _AS(fullFile));
|
|
}
|
|
|
|
#include"TGAs.h"
|
|
// 升级tchdata.dbf文件
|
|
void UpdateTchData()
|
|
{
|
|
CodeBase db;
|
|
XString fullFile;
|
|
if(!FindFile(_T("tchdata.dbf"), fullFile))
|
|
{
|
|
AfxMessageBox(_T("tchdata.dbf文件错误!"));
|
|
return;
|
|
}
|
|
XDbfTable *pTable = db.Open(fullFile);
|
|
if(!pTable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
CString sCmd, sCmdNew;
|
|
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
|
|
{
|
|
GET_FIELD(pTable, _T("Engcmd"), sCmd);
|
|
int nIndex = sCmd.Find(_T("_"));
|
|
if(nIndex > 0)
|
|
{
|
|
CString sCmdLeft = sCmd.Left(nIndex);
|
|
sCmdLeft.TrimLeft();
|
|
CString sCmdRight = sCmd.Right(sCmd.GetLength() - nIndex);
|
|
if (!UpdateText(sCmdLeft))
|
|
{
|
|
continue;
|
|
}
|
|
sCmdNew = sCmdLeft + sCmdRight;
|
|
SET_FIELD(pTable, _T("Engcmd"), (const TCHAR*)sCmdNew);
|
|
}
|
|
}
|
|
}
|
|
// 工具条升级
|
|
void UpdateToolBar()
|
|
{
|
|
UpdateTchData();
|
|
UpdateAcad();
|
|
}
|
|
|
|
|
|
int GetFullOsMode(int nFlagsAdd)
|
|
{
|
|
int nOsMode=0;
|
|
xg_getvar(_T("OSMODE"), &nOsMode);
|
|
nOsMode &= ~0x4000;
|
|
nOsMode |= nFlagsAdd;
|
|
return nOsMode;
|
|
}
|
|
|
|
// 拖曳显示点
|
|
class TDimensionEdJig : public AcEdJig
|
|
{
|
|
public:
|
|
TDimensionEdJig(TDbDimension2 *pDim, const TCHAR *pszPrompt, const TCHAR *pszKeyword=NULL);
|
|
~TDimensionEdJig();
|
|
int doIt();
|
|
virtual DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
virtual AcDbEntity* entity() const;
|
|
void Swap();
|
|
|
|
int GetRetCode(int *kwordId=NULL) const;
|
|
int m_nRetCode; //返回码
|
|
const TCHAR *m_pszPrompt; //提示信息
|
|
const TCHAR *m_pszKeyword; //关键字
|
|
TDbDimension2 *m_pDrawEnt; //临时实体,
|
|
TDbDimension2 *m_pTemp; //临时实体, 用于m_nFlag==3
|
|
|
|
XPoint m_ptDim;
|
|
int m_nFlag; //0--尺寸方向, 1--尺寸线位置, 2--第二个标注点, 3--其它标注点
|
|
|
|
//add by whl on 03/08/08
|
|
DListStack<XPoint> ptStack;//标注点栈
|
|
void Step();//当前点入栈
|
|
void Undo();//撤消
|
|
XPoint GetLastPoint();
|
|
bool CanUndo();//是否可撤消
|
|
//add by lgy 20120315 设置弧长标注标记
|
|
void SetIsArcDim();
|
|
|
|
BOOL m_bInView; //add by lgy 20120503 保存标注是否是在视口中绘制
|
|
int m_nPortNum; //视口编号
|
|
AcDbObjectIdArray m_aryViewPorts; // add by lgy 20120507 保存所有视口对象
|
|
AcDbObjectId m_idDimNew;//新标注样式ID
|
|
AcDbObjectId m_idDimOld;//老标注样式ID
|
|
BOOL m_bSaveStyle; //保存是不是设置新样式
|
|
protected:
|
|
void FindAndRemoveSeg(XPoint pt);//由一标注点找出对应段并且正确去除之
|
|
|
|
private:
|
|
//add by lxb on 2011/11/22
|
|
AcEdInputPointMonitorEx m_cMonitor;//监视器
|
|
bool m_bIsArcDim; //add by lgy 20120315 弧长标注标记
|
|
};
|
|
|
|
void GetDimLayByPipeSys(const CString &sLayer, CString &sDimLayer)
|
|
{
|
|
if (sLayer == LAY_PIPE_FEED || sLayer == LAY_PIPE_FEED2 || sLayer == LAY_PIPE_FEED3)
|
|
{
|
|
sDimLayer = LAY_DIM_FEED;
|
|
}
|
|
else if (sLayer == LAY_PIPE_HEADFEED || sLayer == LAY_PIPE_HEADFEED2 || sLayer == LAY_PIPE_HEADFEED3)
|
|
{
|
|
sDimLayer = LAY_DIM_HEADFEED;
|
|
}
|
|
else if(sLayer == LAY_PIPE_HEADBACK || sLayer == LAY_PIPE_HEADBACK2 || sLayer == LAY_PIPE_HEADBACK3)
|
|
{
|
|
sDimLayer = LAY_DIM_HEADBACK;
|
|
}
|
|
else if(sLayer == LAY_PIPE_DIRT)
|
|
{
|
|
sDimLayer = LAY_DIM_DIRT;
|
|
}
|
|
else if(sLayer == LAY_PIPE_USELESS)
|
|
{
|
|
sDimLayer = LAY_DIM_USELESS;
|
|
}
|
|
else if(sLayer == LAY_PIPE_RAIN)
|
|
{
|
|
sDimLayer = LAY_DIM_RAIN;
|
|
}
|
|
else if(sLayer == LAY_PIPE_USED || sLayer == LAY_PIPE_USED2 || sLayer == LAY_PIPE_USED3)
|
|
{
|
|
sDimLayer = LAY_DIM_USED;
|
|
}
|
|
else if(sLayer == LAY_PIPE_FIRE || sLayer == LAY_PIPE_FIRE2 || sLayer == LAY_PIPE_FIRE3)
|
|
{
|
|
sDimLayer = LAY_DIM_HYDRANT;
|
|
}
|
|
else if(sLayer == LAY_PIPE_SPRINKLE || sLayer == LAY_PIPE_SPRINKLE2 || sLayer == LAY_PIPE_SPRINKLE3)
|
|
{
|
|
sDimLayer = LAY_DIM_SPRINKLE;
|
|
}
|
|
else if(sLayer == LAY_PIPE_COAGULATE)
|
|
{
|
|
sDimLayer = LAY_DIM_COAGULATE;
|
|
}
|
|
else if(sLayer == LAY_PIPE_DRINK)
|
|
{
|
|
sDimLayer = LAY_DIM_DRINK;
|
|
}
|
|
else if(sLayer == LAY_PIPE_PRESSDIRT)
|
|
{
|
|
sDimLayer = LAY_DIM_PRESSDIRT;
|
|
}
|
|
else if(sLayer == LAY_PIPE_PRESSUSELESS)
|
|
{
|
|
sDimLayer = LAY_DIM_PRESSUSELESS;
|
|
}
|
|
else if(sLayer == LAY_PIPE_PRESSRAIN)
|
|
{
|
|
sDimLayer = LAY_DIM_PRESSRAIN;
|
|
}
|
|
else if(sLayer == LAY_PIPE_USER1)
|
|
{
|
|
sDimLayer = LAY_DIM_USER1;
|
|
}
|
|
else if(sLayer == LAY_PIPE_USER2)
|
|
{
|
|
sDimLayer = LAY_DIM_USER2;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER3)
|
|
{
|
|
sDimLayer = LAY_DIM_USER3;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER4)
|
|
{
|
|
sDimLayer = LAY_DIM_USER4;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER5)
|
|
{
|
|
sDimLayer = LAY_DIM_USER5;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER6)
|
|
{
|
|
sDimLayer = LAY_DIM_USER6;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER7)
|
|
{
|
|
sDimLayer = LAY_DIM_USER7;
|
|
}
|
|
else if (sLayer == LAY_PIPE_USER8)
|
|
{
|
|
sDimLayer = LAY_DIM_USER8;
|
|
}
|
|
else if(sLayer == LAY_PIPE_OTHER)
|
|
{
|
|
sDimLayer = LAY_DIM_OTHER;
|
|
}
|
|
}
|
|
|
|
//add by lgy 20120509 判断点在不在实体上
|
|
//pt:模型空间中的点
|
|
//返回值:如果pt在当前图纸中的莫个实体上,返回TRUE,否则返回FALSE
|
|
BOOL GetIsOnEntity(XPoint pt)
|
|
{
|
|
BOOL bOn = FALSE; // 用来保存点是否在实体上
|
|
|
|
AcDbBlockTable *pTable = NULL;
|
|
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTable, AcDb::kForRead);
|
|
if (es != Acad::eOk)
|
|
{
|
|
return bOn;
|
|
}
|
|
|
|
AcDbBlockTableRecord *pBlockTableRecord = NULL;
|
|
es = pTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForRead);
|
|
if (es != Acad::eOk)
|
|
{
|
|
pTable->close();
|
|
return bOn;
|
|
}
|
|
|
|
AcDbBlockTableRecordIterator *pBlockIterator = NULL;
|
|
if (Acad::eOk == pBlockTableRecord->newIterator(pBlockIterator))
|
|
{
|
|
AcDbEntity *pEnt = NULL;
|
|
for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step())
|
|
{
|
|
if (Acad::eOk == pBlockIterator->getEntity(pEnt, AcDb::kForRead))
|
|
{
|
|
XPoly2D polyEnt;
|
|
|
|
if (pEnt->isKindOf(TDbCurveEntity::desc())) // 大部分上华对象
|
|
{
|
|
TDbCurveEntity *pTgCurveEntity = (TDbCurveEntity*)pEnt;
|
|
pTgCurveEntity->GetClipBoundary(polyEnt);
|
|
}
|
|
else if (pEnt->isKindOf(TDbEntity::desc())) // 大部分上华对象
|
|
{
|
|
TDbCurveEntity *pTgEntity = (TDbCurveEntity*)pEnt;
|
|
pTgEntity->GetClipBoundary(polyEnt);
|
|
}
|
|
else // CAD对象
|
|
{
|
|
PickSet entTempSet(SS_FREE);
|
|
entTempSet += pEnt->objectId();
|
|
if (entTempSet.Length() == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
XPoly2D polyTemp(entTempSet[0L]);
|
|
polyEnt = polyTemp;
|
|
}
|
|
|
|
int nSegs = polyEnt.TotalSegments();
|
|
for (int k=0; k<nSegs; k++)
|
|
{
|
|
XCurveSegment cvSeg;
|
|
polyEnt.Nth(k, cvSeg);
|
|
|
|
XPoint ptProject;
|
|
cvSeg.ProjectToMe(pt, ptProject);
|
|
|
|
double d2PtDistance = ptProject.Distance2d(pt);
|
|
if (d2PtDistance < 10 + _DIST_SNAP)
|
|
{
|
|
bOn = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
pEnt->close();
|
|
if (bOn) // 点在实体上
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
delete pBlockIterator;
|
|
pBlockIterator = NULL;
|
|
}
|
|
|
|
pTable->close();
|
|
pBlockTableRecord->close();
|
|
return bOn;
|
|
}
|
|
|
|
XPoint ChangePtFromUCSToWCS(XPoint pt, XPoint ptOrg, XVector3D vtX, XVector3D vtY)
|
|
{
|
|
AcGePoint2d ptOrigin(ptOrg.x, ptOrg.y),
|
|
ptResult = pt.AsAcGePoint2d();
|
|
AcGeVector2d xAxis(vtX.x, vtX.y),
|
|
yAxis(vtY.x, vtY.y);
|
|
|
|
AcGeMatrix2d mat2d;
|
|
mat2d = mat2d.alignCoordSys(AcGePoint2d(0, 0), AcGeVector2d(1, 0), AcGeVector2d(0, 1), ptOrigin, xAxis, yAxis);
|
|
|
|
ptResult.transformBy(mat2d);
|
|
return XPoint(ptResult.x, ptResult.y);
|
|
}
|
|
|
|
// add by lgy 20120509 以下函数目的是为了获得点在的视口编号和视口比例
|
|
// pt:图纸空间中点取的点
|
|
// dScale:对应视口的比例
|
|
// entSet:当前图纸所有视口对象
|
|
// 返回值:视口编号 如果为0表示没有点中视口
|
|
int GetPtOnWhichPort(XPoint pt, double &dScale, BOOL &bOnEnt, AcDbObjectIdArray aryViewPorts)
|
|
{
|
|
int nSize = aryViewPorts.logicalLength();
|
|
for (int m=0; m<nSize; m++)
|
|
{
|
|
OPENOBJ_BEGIN(aryViewPorts[m], AcDb::kForRead, AcDbViewport, pViewPort);
|
|
if (pViewPort == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int nNumber = pViewPort->number();
|
|
if (nNumber == 1)
|
|
continue;
|
|
|
|
double dWidth = pViewPort->width(),
|
|
dHeight = pViewPort->height(),
|
|
dTwist = pViewPort->twistAngle();
|
|
dScale = pViewPort->customScale();
|
|
|
|
XPoint ptMSCenter = pViewPort->viewCenter(),
|
|
ptPSCenter = pViewPort->centerPoint();
|
|
|
|
AcGePoint3d ptVPOrg;
|
|
AcGeVector3d vtVPX, vtVPY;
|
|
pViewPort->getUcs(ptVPOrg, vtVPX, vtVPY);
|
|
|
|
XPoly2D poly;
|
|
if (!pViewPort->isNonRectClipOn())
|
|
{
|
|
XRectAngle rect(ptPSCenter, dWidth, dHeight);
|
|
rect.AsPoly2D(poly);
|
|
}
|
|
else
|
|
{
|
|
AcDbObjectId idPLine = pViewPort->nonRectClipEntityId();
|
|
OPENOBJ_BEGIN(idPLine, AcDb::kForRead, AcDbPolyline, pPLine);
|
|
if (pPLine == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
PolyConvert(*pPLine, poly);
|
|
OPENOBJ_END();
|
|
}
|
|
poly.SetClosed();
|
|
poly.SetElevation(0.0);
|
|
|
|
if ((pt&poly) == PR_INSIDE) // 在视口内
|
|
{
|
|
if (!pViewPort->isOn())
|
|
continue;
|
|
|
|
XPoint ptView, ptView2MS;
|
|
double dAngle = ads_angle(ptPSCenter, pt), // 点取的点跟视口中心点的角度
|
|
dDistance = ptPSCenter.Distance2d(pt);
|
|
ads_polar(ptMSCenter, dAngle, dDistance/dScale, ptView);
|
|
|
|
if (fabs(dTwist) > _angSnap)
|
|
ptView2MS = ChangePtFromUCSToWCS(ptView, XPoint(ptVPOrg), XVector3D(vtVPX), XVector3D(vtVPY));
|
|
else
|
|
ptView2MS = ptView;
|
|
|
|
bOnEnt = GetIsOnEntity(ptView2MS); // 判断点是否在实体上
|
|
|
|
return pViewPort->number();
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//add by lgy 20120315 设置弧长标记
|
|
void TDimensionEdJig::SetIsArcDim()
|
|
{
|
|
m_bIsArcDim = true;
|
|
}
|
|
|
|
//add by whl on 03/08/08
|
|
void TDimensionEdJig::FindAndRemoveSeg(XPoint pt)
|
|
{
|
|
XCurveSegment seg=m_pDrawEnt->GetDimCurve();
|
|
XPoint ptOnSeg;
|
|
seg.ProjectToMe(pt, ptOnSeg);
|
|
double value=seg.StartPoint().Distance2d(ptOnSeg);
|
|
long i=-1;
|
|
if(value>_DIST_SNAP)
|
|
{
|
|
double curValue=0;
|
|
for(i=0;i<m_pDrawEnt->GetSegmentNum();i++)
|
|
{
|
|
curValue+=m_pDrawEnt->GetSegment(i);
|
|
if(fabs(curValue-value)<_DIST_SNAP)
|
|
break;
|
|
}
|
|
}
|
|
if(i>=m_pDrawEnt->GetSegmentNum())
|
|
return;//useful
|
|
|
|
if(i>=0)
|
|
{
|
|
double temp=m_pDrawEnt->GetSegment(i);
|
|
if(i<(m_pDrawEnt->GetSegmentNum()-1))//是中间段
|
|
m_pDrawEnt->SetSegment(i+1,temp+m_pDrawEnt->GetSegment(i+1));//后一段合并之
|
|
m_pDrawEnt->RemoveSegment(i);
|
|
}
|
|
else//第一个标注段的起点(不一定是DimContinue中提示的第一点)特殊处理
|
|
{
|
|
double temp=m_pDrawEnt->GetSegment(0);
|
|
m_pDrawEnt->RemoveSegment(0);
|
|
XVector3D vt=seg.EndPoint()-seg.StartPoint();
|
|
vt.Scale(temp/vt.Length());
|
|
m_pDrawEnt->SetLocation(m_pDrawEnt->GetLocation()+vt);
|
|
}
|
|
}
|
|
void TDimensionEdJig::Step()
|
|
{
|
|
ptStack.Push(m_ptDim);
|
|
}
|
|
bool TDimensionEdJig::CanUndo()
|
|
{
|
|
return ptStack.GetDepth()>1;
|
|
}
|
|
void TDimensionEdJig::Undo()
|
|
{
|
|
XPoint pt;
|
|
ptStack.GetTopData(pt);
|
|
ptStack.GoBack();
|
|
if(CanUndo())
|
|
m_pDrawEnt->FindAndRemoveSegment(pt);
|
|
}
|
|
XPoint TDimensionEdJig::GetLastPoint()
|
|
{
|
|
XPoint pt;
|
|
ptStack.GetTopData(pt);
|
|
return pt;
|
|
}
|
|
//end
|
|
|
|
void TDimensionEdJig::Swap()
|
|
{
|
|
if(m_pTemp) {
|
|
AcDbDeepCloneFiler filer;
|
|
if(m_pTemp->dwgOut(&filer)==Acad::eOk) {
|
|
filer.seek(0L,0);
|
|
VERIFY(m_pDrawEnt->dwgIn(&filer)==Acad::eOk);
|
|
}
|
|
ASSERT(m_pTemp && m_pTemp->IsValid());
|
|
} else {
|
|
m_pTemp = (TDbDimension2 *)m_pDrawEnt->clone();
|
|
ASSERT(m_pTemp && m_pTemp->IsValid());
|
|
}
|
|
}
|
|
|
|
// 转换成ADS代码
|
|
int TDimensionEdJig::GetRetCode(int *kwordId) const
|
|
{
|
|
int ret = m_nRetCode;
|
|
if (ret == AcEdJig::kCancel)
|
|
ret = RTCAN;
|
|
else if(ret == AcEdJig::kNull)
|
|
ret = RTNONE;
|
|
else if (ret <= 0)
|
|
ret = RTNORM;
|
|
else {
|
|
if(kwordId) *kwordId = ret;
|
|
ret = RTKWORD;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
TDimensionEdJig::TDimensionEdJig(TDbDimension2 *pDim, const TCHAR *pszPrompt, const TCHAR *pszKeyword)
|
|
:m_pDrawEnt(pDim), m_pszPrompt(pszPrompt), m_pszKeyword(pszKeyword), m_nRetCode(0),m_cMonitor(curDoc())
|
|
{
|
|
m_pTemp=NULL;
|
|
m_nFlag=0;
|
|
m_ptDim=pDim->GetLocation();
|
|
//add by lgy 20120315 弧长标注标记
|
|
m_bIsArcDim = false; //false为不是弧长标注
|
|
|
|
m_bInView = FALSE; //add by lgy 20120503 保存标注是否是在视口中绘制
|
|
m_nPortNum = 0; //add by lgy 20120509 默认视口为0
|
|
m_bSaveStyle = FALSE;//add by lgy 20120519 默认不保存标注样式
|
|
|
|
m_aryViewPorts.setLogicalLength(0);
|
|
}
|
|
|
|
TDimensionEdJig::~TDimensionEdJig()
|
|
{
|
|
if(m_pTemp)
|
|
delete m_pTemp;
|
|
}
|
|
|
|
// 开始执行拖动
|
|
int TDimensionEdJig::doIt()
|
|
{
|
|
setDispPrompt(m_pszPrompt);
|
|
try
|
|
{
|
|
m_nRetCode = drag();
|
|
}
|
|
catch(...)
|
|
{
|
|
m_nRetCode=AcEdJig::kCancel;
|
|
}
|
|
return GetRetCode();
|
|
}
|
|
|
|
// 反馈
|
|
AcEdJig::DragStatus TDimensionEdJig::sampler()
|
|
{
|
|
DragStatus stat;
|
|
|
|
setUserInputControls((UserInputControls)
|
|
(AcEdJig::kAccept3dCoordinates|AcEdJig::kNullResponseAccepted));
|
|
|
|
if (m_pszKeyword) setKeywordList(m_pszKeyword);
|
|
XPoint ptTemp;
|
|
if(m_nFlag==0)
|
|
{
|
|
stat=acquirePoint(ptTemp, m_pDrawEnt->GetLocation().AsAcGePoint3d());
|
|
}
|
|
else if((m_nFlag == 1) || (m_nFlag == 2))
|
|
{
|
|
//add by lxb on 2011/11/22
|
|
//获取当前光标坐标
|
|
// sg modify 120706,不知道为什么在64位下,用m_cMonitor.GetCursorPos()得到的鼠标当前位置点,始终是原点,换一种方法实现
|
|
TADSGePoint3d ptCur;
|
|
#ifndef _WIN64
|
|
ptCur = m_cMonitor.GetCursorPos();
|
|
#else
|
|
GetWcsCursor(ptCur);
|
|
#endif
|
|
|
|
//辅助计算直线
|
|
XLine line1(ptStack[0],ptStack[1]);
|
|
ads_real rAng = line1.Direction();
|
|
XPoint pt;
|
|
ads_polar(ptCur, rAng + 0.5 * PI, 100.0, pt);
|
|
XLine line2(ptCur, pt);
|
|
|
|
//获取基点
|
|
ads_point ptIntersection;
|
|
line1.Intersection(&line2,ptIntersection);
|
|
AcGePoint3d ptBase = asPnt3d(ptIntersection);
|
|
|
|
//modify by lgy 20120314 弧长标注中开始选中标注弧长时jig显示出一条多余的线
|
|
//stat = acquirePoint(ptTemp,ptBase);
|
|
if (!m_bIsArcDim)
|
|
{
|
|
stat = acquirePoint(ptTemp,ptBase);
|
|
}
|
|
else
|
|
{
|
|
stat = acquirePoint(ptTemp);
|
|
}
|
|
}
|
|
else if(m_nFlag==3)
|
|
{
|
|
//modidfied by whl on 03/08/08
|
|
XPoint ptLast=GetLastPoint();
|
|
stat=acquirePoint(ptTemp, ptLast);
|
|
}
|
|
else if(m_nFlag==4)
|
|
{
|
|
XPoint ptLast;
|
|
xg_getvar(_T("LASTPOINT"), ptLast);
|
|
ptLast = Ucs2Wcs(ptLast);
|
|
stat=acquirePoint(ptTemp, ptLast);
|
|
}
|
|
|
|
if(stat == AcEdJig::kNormal)
|
|
{
|
|
if (ptTemp.Distance2d(m_ptDim)>_DIST_SNAP)
|
|
{
|
|
double nDist=m_ptDim.Distance2d(ptTemp);
|
|
m_ptDim=ptTemp;
|
|
}
|
|
else
|
|
{
|
|
return AcEdJig::kNoChange;
|
|
}
|
|
}
|
|
|
|
return stat;
|
|
}
|
|
|
|
// 更新实体数据
|
|
Adesk::Boolean TDimensionEdJig::update()
|
|
{
|
|
if(m_nFlag==0)
|
|
{
|
|
m_pDrawEnt->SetRotation(ads_angle(m_ptDim, m_pDrawEnt->GetLocation())+PI);
|
|
double nVal=m_ptDim.Distance2d(m_pDrawEnt->GetLocation());
|
|
//modify by lgy 20120503 如果标注在图纸空间中的视口中
|
|
//if(m_pDrawEnt->IsValidSegment(nVal))
|
|
// m_pDrawEnt->SetSegment(0, nVal);
|
|
if(m_pDrawEnt->IsValidSegment(nVal))
|
|
{
|
|
m_pDrawEnt->SetSegment(0, nVal);
|
|
|
|
if (m_bInView)
|
|
{
|
|
double dScale = 1.0;
|
|
BOOL bFit = FALSE;
|
|
|
|
int nNum = GetPtOnWhichPort(m_ptDim, dScale, bFit, m_aryViewPorts);
|
|
if (nNum == m_nPortNum || !bFit)
|
|
{
|
|
m_pDrawEnt->SetStyleId(m_idDimNew);
|
|
m_bSaveStyle = TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_pDrawEnt->SetStyleId(m_idDimOld);
|
|
m_bSaveStyle = FALSE;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
else if(m_nFlag==1)
|
|
{
|
|
XCurveSegment seg=m_pDrawEnt->GetDimCurve();
|
|
XPoint ptOnSeg;
|
|
if(seg.ProjectToMe(m_ptDim, ptOnSeg)==RTNORM)
|
|
{
|
|
double nDistMove=m_ptDim.Distance2d(ptOnSeg);
|
|
int nSideLoc=seg.OnWhichSide(m_pDrawEnt->GetLocation());
|
|
int nSide=seg.OnWhichSide(m_ptDim);
|
|
double nDist2Dim=m_pDrawEnt->GetDist2DimLine(FALSE);
|
|
|
|
if(fabs(nDist2Dim)>1.0E-6)
|
|
{
|
|
double nFactor=nDist2Dim/fabs(nDist2Dim);
|
|
if(nSide!=nSideLoc)
|
|
nDistMove *= nFactor;
|
|
else
|
|
nDistMove *= -nFactor;
|
|
}
|
|
else
|
|
{
|
|
if(nSideLoc=OFFSET_LEFT) nDistMove=-nDistMove;
|
|
//else nDist2Dim=nDistMove;
|
|
}
|
|
/*
|
|
if(fabs(nDist2Dim)>1.0E-6) {
|
|
double nFactor=nDist2Dim/fabs(nDist2Dim);
|
|
if(nSide!=nSideLoc)
|
|
nDist2Dim += nFactor*nDistMove;
|
|
else
|
|
nDist2Dim -= nFactor*nDistMove;
|
|
} else {
|
|
if(nSideLoc=OFFSET_LEFT) nDist2Dim=-nDistMove;
|
|
else nDist2Dim=nDistMove;
|
|
}*/
|
|
if(m_pDrawEnt->IsAngular())
|
|
{ //弧墙有错,不知道原因
|
|
nDist2Dim += nDistMove;
|
|
double nDistRad= m_pDrawEnt->GetDimRadius();
|
|
//seg.GetArc().center.Distance(m_ptDim);
|
|
nDistRad -= nDistMove;
|
|
if(nDistRad>_DIST_SNAP)
|
|
{
|
|
m_pDrawEnt->SetDimRadius(nDistRad);
|
|
m_pDrawEnt->SetDist2DimLine(nDist2Dim, FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nDist2Dim += nDistMove;
|
|
m_pDrawEnt->SetDist2DimLine(nDist2Dim, FALSE);
|
|
}
|
|
|
|
}
|
|
}
|
|
else if(m_nFlag==2)
|
|
{ //修改标注位置
|
|
AcDbIntArray indices;
|
|
indices.append(3);
|
|
AcGePoint3dArray ptArray;
|
|
m_pDrawEnt->getStretchPoints(ptArray);
|
|
ASSERT(ptArray.length()>3);
|
|
AcGeVector3d vtOffset=m_ptDim.AsAcGePoint3d()-ptArray[3];
|
|
m_pDrawEnt->moveGripPointsAt(indices, vtOffset);
|
|
}
|
|
else if(m_nFlag==3)
|
|
{//modified by whl on 03/08/08
|
|
ASSERT(m_pTemp);
|
|
CopyObject(*m_pDrawEnt, *m_pTemp);
|
|
if(CanUndo())
|
|
{
|
|
if(!m_pTemp->AddSegment(m_ptDim))
|
|
return Adesk::kFalse;
|
|
}
|
|
else
|
|
{
|
|
m_pTemp->SetRotation(ads_angle(m_ptDim, m_pTemp->GetLocation())+PI);
|
|
double nVal=m_ptDim.Distance2d(m_pTemp->GetLocation());
|
|
if(m_pTemp->IsValidSegment(nVal))
|
|
m_pTemp->SetSegment(0, nVal);
|
|
}
|
|
ASSERT(m_pTemp && m_pTemp->IsValid());
|
|
}
|
|
else if(m_nFlag==4)
|
|
{
|
|
ASSERT(m_pTemp);
|
|
CopyObject(*m_pDrawEnt, *m_pTemp);
|
|
m_pTemp->AddSegment(m_ptDim);
|
|
}
|
|
ASSERT(m_pDrawEnt && m_pDrawEnt->IsValid());
|
|
return Adesk::kTrue;
|
|
}
|
|
|
|
AcDbEntity* TDimensionEdJig::entity() const
|
|
{
|
|
if((m_nFlag==3 || m_nFlag==4) && m_pTemp)
|
|
return m_pTemp;
|
|
else
|
|
return m_pDrawEnt;
|
|
}
|
|
|
|
// add by xly on 100915 设置符号标注的图层切换属性
|
|
extern TARCH_IMPEXP BOOL g_bTextDefaultLayer;
|
|
// add by xly 0n 100915 设置实体的图层并将实体添加到图纸中
|
|
AcDbObjectId AddToSpace(Adesk::Boolean bClosed, TDbEntity *pEntSymb, CString &sDimLayer)
|
|
{
|
|
const TCHAR *pszLayer = pEntSymb->GetDefaultLayer();
|
|
|
|
// 设置在默认图层
|
|
if(pszLayer && g_bTextDefaultLayer)
|
|
{
|
|
AcDbObjectId idLayer = InitLayer(pszLayer, TRUE);
|
|
InitLayer(sDimLayer, TRUE);
|
|
|
|
// modify by xly on 101028 没有作用可以删除,添加一个ID是否可用的判断
|
|
//SetLayer(pszLayer);
|
|
//pEntSymb->setLayer(pszLayer);
|
|
if (!sDimLayer.IsEmpty())
|
|
{
|
|
pEntSymb->setLayer(sDimLayer);
|
|
}
|
|
else if (idLayer.isValid())
|
|
{
|
|
pEntSymb->setLayer(pszLayer);
|
|
}
|
|
}
|
|
|
|
return AddToCurrentSpace(pEntSymb, bClosed, Adesk::kTrue);
|
|
}
|
|
|
|
// Command: 逐点标注
|
|
// 支持尺寸自调
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//modified by cwk on 060914
|
|
void DimContinue()
|
|
{
|
|
// add by lgy 20120507,保存当前空间是模型空间还是图纸空间
|
|
// 0:图纸空间;1:模型空间
|
|
int iTitleMode = 0;
|
|
if (xg_getvar(_T("TILEMODE"), &iTitleMode) != RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
|
|
BOOL b = FALSE;
|
|
InitLayer(LAY_DIM, TRUE);
|
|
TDbDimension2 dim;
|
|
XPoint ptStart;
|
|
XPointList lstAddPoint; //wcs
|
|
XPointList lstBasePoint;//ucs
|
|
|
|
XPushVar<int> osmode(_T("OSMODE"), GetFullOsMode(OS_INT|OS_END));
|
|
|
|
if (XGetPoint(NULL, _T("\n起点"), ptStart)==RTNORM)
|
|
{
|
|
XPushVar<int> osmode1(_T("OSMODE"), GetFullOsMode(OS_PER|OS_INT|OS_END));
|
|
lstBasePoint.Append(new XPoint(ptStart));
|
|
ptStart=Ucs2Wcs(ptStart);
|
|
|
|
CString sDimLayer;
|
|
PickSet ss(SS_FREE);
|
|
if (GetPipe(ptStart, ss))
|
|
{
|
|
Entity entPipe = ss[0l];
|
|
TCHAR szLayer[256];
|
|
entPipe.GetData(8, szLayer);
|
|
CString sLayer = szLayer;
|
|
GetDimLayByPipeSys(sLayer, sDimLayer);
|
|
|
|
}
|
|
|
|
TDbDimension2 *pDim = &dim;
|
|
// add by cwk on 060915
|
|
if (pDim->GetSegmentNum() >= 1)
|
|
{
|
|
pDim->RemoveSegment(1);
|
|
}
|
|
|
|
// modify by xly on 110107 支持图层切换
|
|
// pDim->setLayer(LAY_DIM);
|
|
pDim->SetDist2DimLine(6.0);
|
|
pDim->SetLocation(ptStart);
|
|
pDim->AppendSegment(2.0*_DIST_SNAP);
|
|
// modify by lgy 20120507 保存标注样式id,以用来在视口空间中是否需要转换
|
|
// pDim->SetStyleId(InitDimStyle(DS_LINEAR));
|
|
AcDbObjectId idDimStyle = InitDimStyle(DS_LINEAR);
|
|
pDim->SetStyleId(idDimStyle);
|
|
|
|
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
|
pDim->SetLayoutRotation(Ucs2Wcs(0.0));
|
|
|
|
TDimensionEdJig jig(pDim, _T("\n第二点<退出>: "));
|
|
|
|
//add by lgy 20120507 如果当前是图纸空间
|
|
BOOL bExist = FALSE; //如果添加的新的标注样式已经存在,默认不添加不存在
|
|
if (iTitleMode == 0) //当前空间是图纸空间
|
|
{
|
|
AcDbObjectIdArray aryViewPorts;
|
|
{
|
|
AcDbObjectId spaceId = acdbCurDwg()->currentSpaceId();
|
|
OPENOBJ_BEGIN(spaceId, AcDb::kForRead, AcDbBlockTableRecord, pPaperSpace);
|
|
if (pPaperSpace != NULL)
|
|
{
|
|
AcDbBlockTableRecordIterator *pRecIter = NULL;
|
|
if (pPaperSpace->newIterator(pRecIter)==Acad::eOk && pRecIter!=NULL)
|
|
{
|
|
for (pRecIter->start(); !pRecIter->done(); pRecIter->step())
|
|
{
|
|
AcDbEntity *pEntity = NULL;
|
|
if (pRecIter->getEntity(pEntity, AcDb::kForRead)==Acad::eOk && pEntity!=NULL)
|
|
{
|
|
if (pEntity->isKindOf(AcDbViewport::desc()))
|
|
aryViewPorts.append(pEntity->objectId());
|
|
|
|
pEntity->close();
|
|
}
|
|
}
|
|
delete pRecIter;
|
|
}
|
|
pPaperSpace->close();
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
double dScale = 1.0;
|
|
BOOL bOnEnt = FALSE;
|
|
int nNum = GetPtOnWhichPort(ptStart, dScale, bOnEnt, aryViewPorts); //得到视口编号和视口比例
|
|
|
|
if (nNum > 1 && bOnEnt) //不是最外层的大视口
|
|
{
|
|
jig.m_bInView = TRUE;
|
|
jig.m_aryViewPorts.append(aryViewPorts);
|
|
jig.m_nPortNum = nNum;
|
|
jig.m_idDimOld = idDimStyle;
|
|
|
|
//获得原来标注样式在标注样式表中的名字
|
|
CString strName;
|
|
AcDbDimStyleTableRecord *pNewDimStyle = NULL;
|
|
OPENOBJ_BEGIN(idDimStyle, AcDb::kForRead, AcDbDimStyleTableRecord, pDimStyle);
|
|
if (pDimStyle != NULL)
|
|
{
|
|
const TCHAR *pName = NULL;
|
|
pDimStyle->getName(pName);
|
|
strName = pName;
|
|
strName.Format(_T("%s_%.0f"), strName, 1/dScale);
|
|
pNewDimStyle = (AcDbDimStyleTableRecord*)pDimStyle->clone();
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
AcDbDimStyleTable *pDimStyleTbl = NULL;
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
es = acdbHostApplicationServices()->workingDatabase()->getDimStyleTable(pDimStyleTbl, AcDb::kForWrite);
|
|
if (es != Acad::eOk)
|
|
{
|
|
delete pNewDimStyle;
|
|
pNewDimStyle = NULL;
|
|
return;
|
|
}
|
|
|
|
AcDbObjectId id;
|
|
if (!pDimStyleTbl->has(strName))
|
|
{
|
|
if (pNewDimStyle != NULL)
|
|
{
|
|
pNewDimStyle->setName(strName);
|
|
pNewDimStyle->setDimlfac(1/dScale);
|
|
|
|
pDimStyleTbl->add(id, pNewDimStyle);
|
|
pDim->SetStyleId(id);
|
|
jig.m_idDimNew = id;
|
|
pNewDimStyle->close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (pNewDimStyle != NULL)
|
|
{
|
|
delete pNewDimStyle;
|
|
pNewDimStyle = NULL;
|
|
}
|
|
pDimStyleTbl->getAt(strName, id);
|
|
pDim->SetStyleId(id);
|
|
jig.m_idDimNew = id;
|
|
bExist = TRUE;
|
|
}
|
|
pDimStyleTbl->close();
|
|
}
|
|
}
|
|
|
|
jig.Step();//add by whl
|
|
jig.m_nFlag=0;
|
|
jig.doIt();
|
|
//modify by lgy 20120510 逐点标注jig时如果退出了命令需要删除添加的标注样式
|
|
//if(jig.GetRetCode()!=RTNORM)
|
|
// return;
|
|
if (jig.GetRetCode() != RTNORM)
|
|
{
|
|
if (!bExist)
|
|
{
|
|
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
|
if (pRecord)
|
|
{
|
|
pRecord->erase();
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if(!pDim->IsValid())
|
|
{
|
|
adsout << _T("请正确点取!");
|
|
return;
|
|
}
|
|
|
|
//add by lgy 20120509 如果标注样式没有考虑视口,需要将之前添加到标注样式表中的
|
|
//标注样式删除掉
|
|
if (!jig.m_bSaveStyle && !bExist)
|
|
{
|
|
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
|
if (pRecord)
|
|
{
|
|
pRecord->erase();
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
/*
|
|
static int nAnswer=Q_NO;
|
|
nAnswer=YesNoQuestion(_T("\n是否同时作为标注点"), nAnswer);
|
|
if(nAnswer==RTCAN)
|
|
return;
|
|
*/
|
|
XPoint ptSec=jig.m_ptDim;
|
|
XPoint ptAdd;
|
|
XPoint ptBase;
|
|
|
|
ptAdd = ptSec;
|
|
lstAddPoint.Append(new XPoint(ptAdd));
|
|
ptBase = Wcs2Ucs(ptAdd);
|
|
lstBasePoint.Append(new XPoint(ptAdd));
|
|
LAB_REINPUT:
|
|
jig.m_pszPrompt=_T("\n请点取尺寸线位置或 [更正尺寸线方向(D)]<退出>: ");
|
|
jig.Step();//add by whl
|
|
jig.m_nFlag=1;
|
|
jig.m_pszKeyword=_T("D");
|
|
int nKeywordIndex=0;
|
|
INITGET_BEG(-1, _T("D"));
|
|
jig.doIt();
|
|
INITGET_END();
|
|
int nRetCode=jig.GetRetCode();
|
|
//modify by lgy 20120510
|
|
//if(nRetCode==RTCAN)
|
|
// return;
|
|
if (nRetCode == RTCAN)
|
|
{
|
|
if (!bExist)
|
|
{
|
|
OPENOBJ_BEGIN(jig.m_idDimNew, AcDb::kForWrite, AcDbDimStyleTableRecord, pRecord);
|
|
if (pRecord)
|
|
{
|
|
pRecord->erase();
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
return;
|
|
}
|
|
|
|
else if(nRetCode==RTKWORD)
|
|
{
|
|
Entity entDir;
|
|
double nDirection=0.0;
|
|
if(entDir.FilterSelect(_T("\n选择墙或线确定尺寸方向<退出>:"),
|
|
RBList(RTDXF0, _T("LINE,ATS_WALL,ATS_CURTAIN_WALL"), NULL), XPoint())==RTNORM)
|
|
{
|
|
if(entDir.Is(_T("LINE")))
|
|
{
|
|
XLine ln(entDir);
|
|
nDirection=ln.Direction();
|
|
}
|
|
else
|
|
{
|
|
OPENOBJ_BEGIN(entDir, AcDb::kForRead, TDbWall, pWall);
|
|
if(pWall)
|
|
nDirection=pWall->XLine::Direction();
|
|
OPENOBJ_END();
|
|
}
|
|
}
|
|
else
|
|
return;
|
|
|
|
XVector3D vt=ptSec-ptStart;
|
|
double nVal = (vt&XVector3D(cos(nDirection), sin(nDirection)));
|
|
pDim->SetRotation(nDirection);
|
|
pDim->SetSegment(0, nVal);
|
|
goto LAB_REINPUT;
|
|
}
|
|
LAB_RE:
|
|
// GEOAPI BOOL g_szArxContext;
|
|
// if(!g_szArxContext)
|
|
// return;
|
|
AcDbObjectId m_id;
|
|
if(pDim->IsValid() && jig.GetRetCode()!=RTCAN)
|
|
{
|
|
TDbDimension2 *pDimNew = (TDbDimension2 *)pDim->clone();
|
|
ASSERT(pDimNew);
|
|
if(g_nDimAdjust) pDimNew->AdjustDim(g_nDimAdjust!=2);
|
|
|
|
// sg add 120410,增加布局转角的设置,解决UCS下,文字方向错误的问题
|
|
pDimNew->SetLayoutRotation(Ucs2Wcs(0.0));
|
|
|
|
// modify by xly on 110107 支持图层切换
|
|
//m_id = pDimNew->AddToCSpace(Adesk::kTrue);
|
|
m_id = AddToSpace(Adesk::kTrue, (TDbEntity*)pDimNew, sDimLayer);
|
|
}
|
|
TDbDimension2 *pDimTemp;
|
|
acdbOpenObject(pDimTemp,m_id,AcDb::kForRead);
|
|
int nRet;
|
|
XString szPrompt;
|
|
while(1)
|
|
{
|
|
int nLen = lstAddPoint.Length();
|
|
_stprintf(szPrompt, _T("\n请输入其他标注点或 [撤消上一标注点(U)]<结束>: "));
|
|
|
|
INITGET_BEG(0, _T("U R"));
|
|
nRet = acedGetPoint(ptBase, szPrompt, ptAdd);
|
|
INITGET_END();
|
|
if(nRet == RTNORM)
|
|
{
|
|
ptBase = ptAdd;
|
|
ptAdd = Ucs2Wcs(ptAdd);
|
|
if(pDimTemp->upgradeOpen() == Acad::eOk)
|
|
{
|
|
if(!pDimTemp->AddSegment(ptAdd))
|
|
adsout << _T("\n点取位置不合适!");
|
|
else
|
|
{
|
|
lstAddPoint.Append(new XPoint(ptAdd));
|
|
lstBasePoint.Append(new XPoint(ptBase));
|
|
if(g_nDimAdjust)//add by whl on 050530
|
|
pDimTemp->AdjustDim(g_nDimAdjust!=2);
|
|
}
|
|
|
|
pDimTemp->downgradeOpen();
|
|
}
|
|
}
|
|
else if(nRet == RTKWORD)
|
|
{
|
|
XString sKey;
|
|
acedGetInput(sKey);
|
|
if(sKey[0] == _T('R'))
|
|
acedGetPoint(NULL, _T("\n参考点:"), ptBase);
|
|
else if(sKey[0] == _T('U'))
|
|
{
|
|
if(pDimTemp->upgradeOpen() == Acad::eOk)
|
|
{
|
|
if(nLen > 0)
|
|
{
|
|
ptAdd = *lstAddPoint.Tail();
|
|
lstAddPoint.Remove(nLen-1);
|
|
pDimTemp->HitTestOnPoint(ptAdd);
|
|
pDimTemp->FindAndRemoveSegment(ptAdd);
|
|
lstBasePoint.Remove(nLen);
|
|
ptBase = *lstBasePoint.Tail();
|
|
if(g_nDimAdjust)//add by whl on 050530
|
|
pDimTemp->AdjustDim(g_nDimAdjust!=2);
|
|
|
|
}
|
|
pDimTemp->downgradeOpen();
|
|
}
|
|
}
|
|
if (lstAddPoint.Length() <= 0)
|
|
{
|
|
b = FALSE;
|
|
if(pDimTemp->upgradeOpen() == Acad::eOk)
|
|
{
|
|
pDimTemp->erase();
|
|
}
|
|
jig.m_pszKeyword=NULL;
|
|
BOOL bFirst=TRUE;
|
|
jig.m_nFlag=3;
|
|
jig.m_pTemp=(TDbDimension2 *)pDim->clone();
|
|
jig.Undo(); //add by cwk on 060918
|
|
jig.m_pszKeyword=_T("U");
|
|
jig.m_pszPrompt = _T("\n请输入第二标注点<结束>: ");
|
|
int nRet=jig.doIt();
|
|
if(nRet==RTNORM)
|
|
{
|
|
jig.Swap();
|
|
jig.Step();
|
|
ptAdd = jig.m_ptDim;
|
|
lstAddPoint.Append(new XPoint(ptAdd));
|
|
ptBase = Wcs2Ucs(ptAdd);
|
|
lstBasePoint.Append(new XPoint(ptBase));
|
|
if(g_nDimAdjust)//add by whl on 050530
|
|
pDimTemp->AdjustDim(g_nDimAdjust!=2);
|
|
}
|
|
else
|
|
break;
|
|
goto LAB_RE;
|
|
}
|
|
}
|
|
else if (nRet == RTCAN)
|
|
{
|
|
if(pDimTemp->upgradeOpen() == Acad::eOk)
|
|
{
|
|
pDimTemp->erase();
|
|
pDimTemp->downgradeOpen();
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
pDimTemp->close();
|
|
}
|
|
} |