Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

244 lines
8.4 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "SetWall.h" //设置墙体参数的对话框
#include "WallDlg.h"
#include "curtainWallSet.h"
#define EXP_NONE 0
#define EXP_TCH 1
#define EXP_NONE 0
#define EXP_TCH 1
extern TARCH_IMPEXP void TogWallBase();
// 捕捉顺序: 墙基线端点,轴线交点,墙基线最近点,轴线最近点
// ptWcs -- I/O
int AutoSnapWall(XPoint &ptWcs);
int OsGetPointWall(double *ptFrom, const TCHAR *prompt, XPoint &pt, const TCHAR *kword=NULL, int *kwordId=NULL, BOOL *bDiscontinue=NULL);
int OsGetCornerWall(double *ptFrom, const TCHAR *prompt, XPoint &pt, const TCHAR *kword=NULL, int *kwordId=NULL);
// 拖曳画线性墙
int DragDrawLine(CDrawWallDlg *pDlg, XPoint &ptStart, const TCHAR *prompt, XPoint &ptEnd,
const TCHAR *kword=NULL, int *kwordId=NULL, BOOL *bDiscontinue=NULL);
// 给定起点, 终点进行拖动半径绘制弧
int DragDrawArc_SER(CDrawWallDlg *pDlg, const XPoint &ptStart, const XPoint &ptEnd,
const TCHAR *prompt, double *nRadius, const TCHAR *kword=NULL, int *kwordId=NULL);
// 给定起点, 弧上一点, 进行终点拖动绘制弧
int DragDrawArc_SPE(CDrawWallDlg *pDlg, const XPoint &ptStart, const XPoint &ptAny,
const TCHAR *prompt, XPoint &ptEnd, const TCHAR *kword=NULL, int *kwordId=NULL);
// 给定起点, 终点进行弧上一点拖动绘制弧
int DragDrawArc_SEP(CDrawWallDlg *pDlg, const XPoint &ptStart, const XPoint &ptEnd,
const TCHAR *prompt, XPoint &ptAny, const TCHAR *kword=NULL, int *kwordId=NULL);
extern TARCH_IMPEXP BOOL g_bRevWallFlag;
//玻璃幕墙 add by whl
int DrawGlassWall();
void DrawGlassWallCmd();
int GlassWall(const XCurveSegment &curve,CSPSheet&sheet,CCurtainWallSet&wallSetPage
,CGlassFrameSet&vFrameSet,CGlassFrameSet&hFrameSet)
{
if (curve.GetLength()<g_nMinLenWall)
return RTERROR;
ASSERT(curve.GetLength()>_DIST_SNAP);
wallSetPage.SetWallLength(curve.GetLength());
CAcModuleResourceOverride vTemp;
// Zyu modify on 100722,支持64位
//UINT result=sheet.DoModal();
UINT_PTR result=sheet.DoModal();
if(result==IDOK)
{
TDbCurtainWall *pWall=new TDbCurtainWall;
pWall->assertWriteEnabled();
(XCurveSegment &)(*pWall)=curve;
pWall->SetUsageFlag(TWallData::kNormal);
pWall->SetStyle(TWallData::kCurtain);
//pWall->SetExternal(OFFSET_RIGHT);
pWall->SetExternal(TRUE);
pWall->SetExternal(1,TRUE);//modified by whl
wallSetPage.Init(*pWall);
vFrameSet.Init(*pWall);
hFrameSet.Init(*pWall);
pWall->AddToMSpace(Adesk::kTrue);
return RTNORM;
}
else
return RTERROR;
}
void DrawGlassWallCmd()
{
DrawGlassWall();
}
int DrawGlassWall()
{
CAcModuleResourceOverride vTemp;
CSPSheet sheet(_T("绘制玻璃幕墙"));
CCurtainWallSet dlg0;
CGlassFrameSet dlg1,dlg2(IDD_CURTAIN_WALL2);
dlg1.SetBuddy(&dlg2);
dlg2.SetBuddy(&dlg1);
sheet.AddPage(&dlg0);
sheet.AddPage(&dlg1);
sheet.AddPage(&dlg2);
//创建一个无任何功能作用的CDrawWallDlg对象,其作用只是重用DrawWall()代码时,使编译通过。
//CDrawWallDlg类的成员函数GetLeftWidth()、GetRightWidth()、GetTotalWidth()在
//完全不影响原功能的前提下,进行了少量修改,请将这三个函数替换。
//CDrawWallDlg dlg;
// halfWidth=100;
XPushMemVar<BOOL> vBackup1(CDrawWallDlg::g_bAutoSnap, FALSE);
double lWidth=g_lWallWidth;
double rWidth=g_rWallWidth;
DocSetLWallWidth(100);
DocSetRWallWidth(100);
XPoint ptStart;
int nWallShape=0;
while(1) {
if (XGetPoint(NULL, _T("\n起点"), ptStart)!=RTNORM)
break;
ptStart=Ucs2Wcs(ptStart);
BOOL bDiscontinue=FALSE;
XPointList aStack;
aStack.Append(new XPoint(ptStart));
while(!bDiscontinue) {
double nElev=ptStart.z;
if (nWallShape==0) {
ptStart.z = nElev;
XPoint pt2;
const TCHAR *szKeywords=_T("A");
XPoint &ptFrom=*aStack.Tail();
int nKwordIndex=0;
int rc=0;
rc=DragDrawLine(NULL, ptFrom, _T("\n直墙下一点或 [弧墙(A)]<退出>: "), pt2, szKeywords, &nKwordIndex, &bDiscontinue);
if (rc!=RTKWORD && rc!=RTNORM) break;
if (rc==RTNORM) {
pt2.z = ptStart.z;
XCurveSegment cv(*aStack.Tail(), pt2, 0.0, LS_FINITE);
if (cv.GetLength()>_DIST_SNAP) {
if (GlassWall(cv,sheet,dlg0,dlg1,dlg2)==RTNORM) {
aStack.Append(new XPoint(pt2));
}
}
} else {
if (nKwordIndex==1) {
nWallShape=1;
continue;
} else if (nKwordIndex==2&& *aStack.Tail()!=ptStart) {
XCurveSegment cv(*aStack.Tail(), ptStart, 0.0, LS_FINITE);
if (cv.GetLength()>_DIST_SNAP && GlassWall(cv,sheet,dlg0,dlg1,dlg2)==RTNORM)
{
break;
}
}
}
} else if (nWallShape==1) { //弧墙
XPoint ptEnd;
int rc=OsGetPointWall(*aStack.Tail(), _T("\n弧墙终点<取消>:"), ptEnd, NULL, NULL, &bDiscontinue);
if (rc!=RTNORM) break;
XPushVar<int> orthomode(_T("ORTHOMODE"), 0);
BOOL bOldRevFlag=g_bRevWallFlag;
g_bRevWallFlag=FALSE;
const TCHAR *szPromptAny=_T("\n点取弧上任意点或 [半径(R)]<取消>:");
XPoint ptAny;
int nIdxKeyword, nRetCode;
nRetCode=DragDrawArc_SEP(NULL, *aStack.Tail(), ptEnd, szPromptAny, ptAny, _T("R"), &nIdxKeyword);
if (nRetCode!=RTNORM && nRetCode!=RTKWORD)
break;
XCurveSegment cv;
if (nRetCode==RTKWORD) { //两点半径
static double nRadius=5000.0;
nRetCode=DragDrawArc_SER(NULL, *aStack.Tail(), ptEnd, XString(_T("\n半径<%.f>:"), nRadius), &nRadius, NULL, NULL);
if (nRetCode!=RTCAN) {
double nChordLen=ads_distance(*aStack.Tail(), ptEnd);
if (nChordLen<2.0*nRadius+1.0E-6) {
double bulge=2.0*asin(nChordLen/2.0/nRadius);
cv=XCurveSegment(*aStack.Tail(), ptEnd, bulge, LS_FINITE);
nRetCode=RTNORM;
} else {
adsout << _T("半径值太小!");
nRetCode=RTERROR;
}
}
} else { //三点
cv=XArc(*aStack.Tail(), ptAny, ptEnd);
if (cv.EndPoint().Distance2d(ptEnd)>_DIST_SNAP)
g_bRevWallFlag=TRUE;
}
if (nRetCode==RTNORM || nRetCode==RTKWORD) {
GlassWall(cv,sheet,dlg0,dlg1,dlg2);
aStack.Append(new XPoint(ptEnd));
g_bRevWallFlag=bOldRevFlag;
} else {
g_bRevWallFlag=bOldRevFlag;
break;
}
nWallShape=0;
}
break;
}
break; // Only one
}
DocSetLWallWidth(lWidth);
DocSetRWallWidth(rWidth);
return RTNORM;
}
int EditCurtainWall(AcDbObjectId idWall)
{
OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbCurtainWall, pWall);
if (!pWall)
return RTERROR;
//标记墙内外侧
int nLeftColor=3, nRightColor=6;
//XScreenDc dc(nLeftColor);
XCurveSegment lCurve0, rCurve0;
pWall->GetSideCurve(lCurve0, rCurve0);
lCurve0.SetStartPoint(Wcs2Ucs(lCurve0.GetStartPoint()));
lCurve0.SetEndPoint(Wcs2Ucs(lCurve0.GetEndPoint()));
rCurve0.SetStartPoint(Wcs2Ucs(rCurve0.GetStartPoint()));
rCurve0.SetEndPoint(Wcs2Ucs(rCurve0.GetEndPoint()));
//dc << lCurve0;
//dc.m_nFrontColor = nRightColor;
//dc << rCurve0;
//acedUpdateDisplay();
CAcModuleResourceOverride vTemp;
CSPSheet sheet(_T("玻璃幕墙编辑"));
CCurtainWallSet dlg0;
CGlassFrameSet dlg1,dlg2(IDD_CURTAIN_WALL2);
dlg1.SetBuddy(&dlg2);
dlg2.SetBuddy(&dlg1);
sheet.AddPage(&dlg0);
sheet.AddPage(&dlg1);
sheet.AddPage(&dlg2);
dlg0.Init(*pWall,false);
dlg1.Init(*pWall,false);
dlg2.Init(*pWall,false);
if (sheet.DoModal()==IDOK)
{
pWall->assertWriteEnabled();
dlg0.Init(*pWall);
dlg1.Init(*pWall);
dlg2.Init(*pWall);
if (pWall->upgradeOpen()!=Acad::eOk)
return RTERROR;
}
ads_redraw(NULL, 0);
OPENOBJ_END();
return RTNORM;
}