// DrawingFrameDlg.cpp : 实现文件 // #include "stdafx.h" #include "DrawingFrameDlg.h" #include "dbpl.h" #include #include "TgAs.h" #include "utility.h" static DRAWFRAME::PAGEGRPS g_pagegrp; extern BOOL InvokeTkwMan(const TCHAR *pszLib, BOOL bSelOnly, XString &sBlockName); // extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal,const TCHAR*sKeyword); // extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal); #define APP_TCH_KERNCMD _T("_TCH_KERNCMD") // 图幅描述写到图框图块的扩展数据中 void SaveFrameSize(Entity ent, const TCHAR *sSize) { OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbBlockReference,pEnt); if (pEnt != NULL) { ads_regapp(APP_TCH_KERNCMD); pEnt->assertWriteEnabled(); resbuf *xd = ads_buildlist(1001,APP_TCH_KERNCMD,1000,sSize,NULL); pEnt->setXData(xd); ads_relrb(xd); } OPENOBJ_END(); } // 取图框图块的图幅描述,不存在则返回空字符串 void GetFrameSize(AcDbBlockReference*pEnt, CString &sSize) { sSize=_T(""); pEnt->assertReadEnabled(); resbuf *xd = pEnt->xData(APP_TCH_KERNCMD); if (xd == NULL) return; resbuf* xdId = xd->rbnext; if (xdId == NULL) { ads_relrb(xd); return; } if (xdId->resval.rstring!=NULL) sSize=xdId->resval.rstring; ads_relrb(xd); return; } // 保存专版定制软件中,各个子院或所的信息 CSpecialtyOffice::CSpecialtyOffice() { m_csName = _T(""); m_csTkName = _T(""); m_sMidBlock.m_nHasMidBlock = 0; m_sMidBlock.csDwbName = _T(""); m_sMidBlock.csUpDownBlock = _T(""); m_sMidBlock.csLeftBlock = _T(""); m_sMidBlock.csRightBlock = _T(""); } CSpecialtyOffice::CSpecialtyOffice(const CSpecialtyOffice& srcSpecialtyOffice) { // 下属设计院名或设计所名称 m_csName = srcSpecialtyOffice.m_csName; // 保存通长标题栏的图库名,所有图幅和样式下的通长标题栏,肯定都放到一个TK里 m_csTkName = srcSpecialtyOffice.m_csTkName; // 各个图幅以及横式、立式样式下的通长标题栏图块名数组 m_aryLongTitle.RemoveAll(); int nCount = (int)srcSpecialtyOffice.m_aryLongTitle.GetSize(); for (int i=0; i if (pXMLChildNodePtr->GetAttributeNum() != 5) { return; } CString csKey, csValue, csTmp1, csTmp2; for (int n=0; n<5; n++) // 循环获得从A0到A4的图幅大小 { csKey = pXMLChildNodePtr->GetAttributeName(n); if (csKey.IsEmpty()) // 键不能为空 { m_aryFrameWidth.append(1.0); continue; } csTmp1 = csKey.Right(1); csTmp2.Format(_T("%d"), n); if (_tcsicmp(csTmp2, csTmp1) != 0) // 必须控制从A0到A4的顺序书写 { m_aryFrameWidth.append(1.0); continue; } csValue = pXMLChildNodePtr->GetAttributeValue(csKey); if (csValue.IsEmpty()) // 值不能为空 { csValue = _T("1.0"); } m_aryFrameWidth.append(_tstof(csValue)); } } // 从XML文件中,会签 void CDrawingFrameDlg::GetTicketXML(const CXMLDOMNodePtr &pXMLChildNodePtr) { // sg modify 111014,增加根据XML设置是否绘制会签 // <会签栏 ticket="0"> if (pXMLChildNodePtr->GetAttributeNum() != 1) { return; } CString csKey, csValue; csKey = pXMLChildNodePtr->GetAttributeName(0); if (_tcsicmp(csKey, _T("ticket")) != 0) { return; } csValue = pXMLChildNodePtr->GetAttributeValue(csKey); if (csValue.IsEmpty()) { return; } // 获得是否有会签栏 m_bDefaultTicket = _ttoi(csValue); } // 从XML文件中,通长标题栏 void CDrawingFrameDlg::GetLongTitleXML(const CXMLDOMNodePtr &pXMLChildNodePtr, CSpecialtyOffice &info) { // <通长标题栏 dwb="西南院"> if (pXMLChildNodePtr->GetAttributeNum() != 1) { return; } CString csKey, csValue; csKey = pXMLChildNodePtr->GetAttributeName(0); // dwb="西南院" if (_tcsicmp(csKey, _T("dwb")) != 0) { return; } CXMLDOMNodesPtr pSubChildrens = pXMLChildNodePtr->GetChildrenNodes(csKey); int nCount = pSubChildrens->GetCount(); if (nCount < 1) { return; // 没有具体给出通长标题栏的块名 } csValue = pXMLChildNodePtr->GetAttributeValue(csKey); if (csValue.IsEmpty()) { return; } // sg add 100908,获得TK文件名 info.m_csTkName = csValue; for (int m=0; mGetItem(m); // <横栏 breadth="0" longtitle="00000014"> if (pTitle->GetAttributeNum() != 2) { continue; } // 构造一个通长标题栏与图幅对应关系信息 CSpecialtyOffice::SLongTitle title; csKey = pTitle->GetAttributeName(0); if (_tcsicmp(csKey, _T("breadth")) != 0) { continue; } csValue = pTitle->GetAttributeValue(csKey); if (csValue.IsEmpty()) { continue; } title.csBreadth = csValue; // 图幅 csKey = pTitle->GetAttributeName(1); if (_tcsicmp(csKey, _T("longtitle")) != 0) { continue; } csValue = pTitle->GetAttributeValue(csKey); if (csValue.IsEmpty()) { continue; } title.csLongTitle = csValue; // 块名 csKey = pTitle->GetNodeName(); if (_tcsicmp(csKey, _T("横栏")) == 0) { title.nRow = 1; // 立式图幅 } else { title.nRow = 0; // 横式图幅 } info.m_aryLongTitle.Add(title); // 保存 } } // 从XML文件中,对中标志 void CDrawingFrameDlg::GetMidBlockXML(const CXMLDOMNodePtr &pXMLChildNodePtr, CSpecialtyOffice &info) { // sg add 111021,增加对中标志的支持 // <对中标志 dwb="对中标志"> if (pXMLChildNodePtr->GetAttributeNum() != 1) { return; } CString csKey, csValue; csKey = pXMLChildNodePtr->GetAttributeName(0); // dwb="对中标志" if (_tcsicmp(csKey, _T("dwb")) != 0) { return; } CXMLDOMNodesPtr pSubChildrens = pXMLChildNodePtr->GetChildrenNodes(csKey); int nCount = pSubChildrens->GetCount(); if (nCount < 1) { return; // 没有给图块名 } csValue = pXMLChildNodePtr->GetAttributeValue(csKey); if (csValue.IsEmpty()) { return; } // 从XML里获得“对中标志”节点并且DWB文件存在,才可以将该标志变成是 info.m_sMidBlock.m_nHasMidBlock = 1; info.m_sMidBlock.csDwbName = csValue; for (int n=0; nGetItem(n); // <上下图块 blockid="00000006"> if (pBlock->GetAttributeNum() != 1) { continue; } csKey = pBlock->GetAttributeName(0); if (_tcsicmp(csKey, _T("blockid")) != 0) { continue; } csValue = pBlock->GetNodeName(); if (_tcsicmp(csValue, _T("上下图块")) == 0) { info.m_sMidBlock.csUpDownBlock = pBlock->GetAttributeValue(csKey); } else if (_tcsicmp(csValue, _T("左图块")) == 0) { info.m_sMidBlock.csLeftBlock = pBlock->GetAttributeValue(csKey); } else if (_tcsicmp(csValue, _T("右图块")) == 0) { info.m_sMidBlock.csRightBlock = pBlock->GetAttributeValue(csKey); } } } // sg add 100907,解析TSpecialtyOffice.xml文件,初始化m_lstOfficeInfo列表 bool CDrawingFrameDlg::GetOfficeInfoFromXML() { // 判断是否是专版定制软件,不是专版,则不考虑XML if (!IsSpecialtyVer()) { return true; } // 判断文件是否存在,没有XML的专版,也当成标准版试用 TCString fullFile; if (!FindFile(_T("TSpecialtyOffice.xml"), fullFile)) { return true; } CString strPath = fullFile; CXMLDOMFile *pXMLDoc = new CXMLDOMFile; if (!pXMLDoc->IsFileExist(strPath)) { delete pXMLDoc; return true; } // 开始读取XML文件内容,从此往下,如果不成功,则给出提示,但是不认为是标准版 if (!pXMLDoc->Open(strPath)) { #ifndef _WIN64 MessageBox(_T("打开XML文档失败!请安装MSXML4.0SP2组件")); #else MessageBox(_T("打开XML文档失败!请安装MSXML6.0组件")); #endif delete pXMLDoc; return false; } // 获取根节点,仅仅是标题,专版名称,<上华专版 name="中国建筑专版"> CXMLDOMNodePtr pRoot = pXMLDoc->GetRoot(); CString csNodeName = pRoot->GetNodeName(); if (!pRoot->HasChildNodes() || _tcsicmp(csNodeName, _T("上华专版"))!=0) { MessageBox(_T("TSpecialtyOffice.xml文件格式发生错误!")); delete pXMLDoc; return false; } csNodeName = pRoot->GetAttributeName(0); // name // 获得专版下的各个下属设计院或设计所、会签、图框线宽等等内容 CXMLDOMNodesPtr pAllChildrens = pRoot->GetChildrenNodes(csNodeName); CString csOfficeName,sTmp; int nCount = pAllChildrens->GetCount(), nTitlesNum(0), j(0); for (int i=0; iGetItem(i); csNodeName = pChild->GetNodeName(); if (_tcsicmp(csNodeName, _T("会签栏")) == 0) { GetTicketXML(pChild); continue; } //wlw add 130314 读xml附件栏 else if (_tcsicmp(csNodeName, _T("附件栏")) == 0) { sTmp = pChild->GetAttributeValue(_T("ticket")); m_bDefaultAdjunct = _ttoi(sTmp); continue; } //wlw add 130314 读xml附件栏 else if (_tcsicmp(csNodeName, _T("图幅可用")) == 0) { sTmp = pChild->GetAttributeValue(_T("A0")); m_bA0 = _ttoi(sTmp); sTmp = pChild->GetAttributeValue(_T("A1")); m_bA1 = _ttoi(sTmp); sTmp = pChild->GetAttributeValue(_T("A2")); m_bA2 = _ttoi(sTmp); sTmp = pChild->GetAttributeValue(_T("A3")); m_bA3 = _ttoi(sTmp); sTmp = pChild->GetAttributeValue(_T("A4")); m_bA4 = _ttoi(sTmp); continue; } else if (_tcsicmp(csNodeName, _T("图框线宽")) == 0) { GetLineWidthXML(pChild); continue; } if (_tcsicmp(csNodeName, _T("院别")) != 0) // <院别 name="西南院"> { continue; } csNodeName = pChild->GetAttributeName(); csOfficeName = pChild->GetAttributeValue(csNodeName); // 如:西南院 if (csOfficeName.IsEmpty()) { continue; } // 开始构造下属设计院或设计所的对象 CSpecialtyOffice info; info.m_csName = csOfficeName; // 获得专版下的各个下属设计院或设计所内容 CXMLDOMNodesPtr pAllOffices = pChild->GetChildrenNodes(csNodeName); nTitlesNum = pAllOffices->GetCount(); for (j=0; jGetItem(j); csNodeName = pSubChild->GetNodeName(); if (_tcsicmp(csNodeName, _T("对中标志")) == 0) { GetMidBlockXML(pSubChild, info); continue; } else if (_tcsicmp(csNodeName, _T("通长标题栏")) == 0) { GetLongTitleXML(pSubChild, info); continue; } } // 保存有效信息 m_lstOfficeInfo.Append(new CSpecialtyOffice(info)); } delete pXMLDoc; return true; } // sg add 111102,根据选择的下属院别,获得对中标记图块名称 BOOL CDrawingFrameDlg::GetMidAlignBlock(XString &szUpDownBlock, XString &szLeftBlock, XString &szRightBlock) { BOOL bResult = false; int nLength = m_lstOfficeInfo.Length(); if (nLength < 1) // 不是专版或者没有XML { return bResult; } int nCurSel = m_cmbOffice.GetCurSel(); if (nCurSel < 0) // 获得当前选择的下属设计院或设计所名称 { return bResult; } CString csOffice, csBlkName; m_cmbOffice.GetLBText(nCurSel, csOffice); // 获得下属设计院或设计所名称 for (int i=0; im_csName, csOffice) == 0) { bResult = (pOffice->m_sMidBlock.m_nHasMidBlock == 1); // 是否有对中标志 if (!pOffice->m_sMidBlock.csUpDownBlock.IsEmpty()) // 再获得块名 { szUpDownBlock << pOffice->m_sMidBlock.csDwbName << _T("(") << pOffice->m_sMidBlock.csUpDownBlock << _T(")"); } if (!pOffice->m_sMidBlock.csLeftBlock.IsEmpty()) { szLeftBlock << pOffice->m_sMidBlock.csDwbName << _T("(") << pOffice->m_sMidBlock.csLeftBlock << _T(")"); } if (!pOffice->m_sMidBlock.csRightBlock.IsEmpty()) { szRightBlock << pOffice->m_sMidBlock.csDwbName << _T("(") << pOffice->m_sMidBlock.csRightBlock << _T(")"); } break; } } return bResult; } bool CDrawingFrameDlg::GetLongTitleBlkName() { int nLength = m_lstOfficeInfo.Length(); if (nLength < 1) // 不是专版或者没有XML { return false; } int nCurSel = m_cmbOffice.GetCurSel(); if (nCurSel < 0) // 获得当前选择的下属设计院或设计所名称 { return false; } m_nLastOffice = nCurSel; // sg add 100916,保存用户本次选择的院别 CString csOffice, csBlkName; m_cmbOffice.GetLBText(nCurSel, csOffice); // 获得下属设计院或设计所名称 XString szTmp; for (int i=0; im_csName, csOffice) == 0) { // 判断是否有立式图框 m_bRANGE = pOffice->HasRANGEFrame(); // 再根据图幅和横式、立式的样式获得通长标题栏图块名 csBlkName = pOffice->FindLongTitleBlkName(m_iRow, m_iStandard); if (!csBlkName.IsEmpty()) { szTmp << pOffice->m_csTkName << _T("(") << csBlkName << _T(")"); } break; } } if (szTmp.Length() != 0) // 根据图块名是否为空,判断是否找到了指定的块 { m_strLong = szTmp; } else if (m_bLong) // 未找到对应的图幅信息 { if (!m_bRANGE && m_iRow==1) return false; ::AfxMessageBox(_T("请选择正确的通长标题栏")); return false; } return true; } void CDrawingFrameDlg::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO_A0, m_iStandard); DDX_Radio(pDX, IDC_RADIO_ROW, m_iRow); DDX_Text(pDX, IDC_EDIT_LENGTH, m_strLength); DDX_Text(pDX, IDC_EDIT_WIDTH, m_strWidth); DDX_Control(pDX, IDC_COMBO_LENGTHEN, m_colLenthen); DDX_Control(pDX, IDC_COMBO_CUSTOMSIZE, m_colCustomSize); DDX_Check(pDX, IDC_CHECK_TITLE_STANDARD, m_bStandard); DDX_Check(pDX, IDC_CHECK_TITLE_LONG, m_bLong); DDX_Check(pDX, IDC_CHECK_TICKET, m_bTicket); DDX_Check(pDX, IDC_CHECK_POSITION, m_bPosition); DDX_Check(pDX, IDC_CHECK_ADJUNCT, m_bAdjunct); DDX_CBString(pDX, IDC_COMBO_SCALE, m_strScale); DDX_Check(pDX, IDC_CHECK_SPACE, m_bSpace); DDX_Check(pDX, IDC_CHECK_DIRECT, m_bDirect); DDX_CBIndex(pDX, IDC_COMBO_LENGTHEN, m_iLengthen); DDX_CBIndex(pDX, IDC_COMBO_CUSTOMSIZE, m_iCustomSize); // sg add 100907,判断是否有专版定制中的院别信息列表,控制控件是否显示 DDX_Control(pDX, IDC_COMBO_SECTION_OFFICE, m_cmbOffice); bool bShow = m_lstOfficeInfo.Length() != 0; GetDlgItem(IDC_STATIC_SECTION_OFFICE)->ShowWindow(bShow); GetDlgItem(IDC_COMBO_SECTION_OFFICE)->ShowWindow(bShow); } BEGIN_MESSAGE_MAP(CDrawingFrameDlg, CAcUiDialog) ON_BN_CLICKED(IDC_RADIO_A0, OnDataChangeAx) ON_BN_CLICKED(IDC_RADIO_A1, OnDataChangeAx) ON_BN_CLICKED(IDC_RADIO_A2, OnDataChangeAx) ON_BN_CLICKED(IDC_RADIO_A3, OnDataChangeAx) ON_BN_CLICKED(IDC_RADIO_A4, OnDataChangeAx) ON_BN_CLICKED(IDC_RADIO_ROW, OnDataChangeR) ON_BN_CLICKED(IDC_RADIO_RANGE, OnDataChangeR) ON_CBN_SELCHANGE(IDC_COMBO_LENGTHEN, OnCbnSelchangeComboLenthength) ON_CBN_SELCHANGE(IDC_COMBO_CUSTOMSIZE, OnCbnSelchangeComboCustomsize) ON_EN_KILLFOCUS(IDC_EDIT_LENGTH, OnEnKillfocusEditLength) ON_EN_KILLFOCUS(IDC_EDIT_WIDTH, OnEnKillfocusEditWidth) ON_EN_CHANGE(IDC_EDIT_LENGTH, OnEnChangeEditLength) ON_EN_CHANGE(IDC_EDIT_WIDTH, OnEnChangeEditWidth) ON_BN_CLICKED(IDC_CHECK_TITLE_STANDARD, OnBnClickedCheckTitleStandard) ON_BN_CLICKED(IDC_CHECK_TITLE_LONG, OnBnClickedCheckTitleLong) ON_BN_CLICKED(IDC_CHECK_TICKET, OnBnClickedCheckTicket) ON_BN_CLICKED(IDC_CHECK_POSITION, OnBnClickedCheckPosition) ON_BN_CLICKED(IDC_CHECK_ADJUNCT, OnBnClickedCheckAdjunct) ON_BN_CLICKED(IDC_BUTTON_PICKADJUNCT, OnBnClickedButtonPickadjunct) ON_BN_CLICKED(IDC_BUTTON_PICKTICKET, OnBnClickedButtonPickticket) ON_BN_CLICKED(IDC_BUTTON_PICKTITLE, OnBnClickedButtonPicktitle) ON_BN_CLICKED(IDC_BUTTON_PICKDIRECT, OnBnClickedButtonPickdirect) ON_CBN_KILLFOCUS(IDC_COMBO_SCALE, OnCbnKillfocusComboScale) ON_BN_CLICKED(IDC_CHECK_SPACE, OnBnClickedCheckSpace) ON_BN_CLICKED(IDC_CHECK_DIRECT, OnBnClickedCheckDirect) // sg add 100908,增加院别选择事件 ON_CBN_SELCHANGE(IDC_COMBO_SECTION_OFFICE, OnCbnSelchangeComboOffice) END_MESSAGE_MAP() // CDrawingFrameDlg 消息处理程序 BOOL CDrawingFrameDlg::OnInitDialog() { CAcUiDialog::OnInitDialog(); // 按钮图标 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_PICK); if (!m_hIcon) { AfxMessageBox(_T("无法找到指定ICON文件。")); } else { ((CButton*)GetDlgItem(IDC_BUTTON_PICKTITLE))->SetIcon(m_hIcon); ((CButton*)GetDlgItem(IDC_BUTTON_PICKADJUNCT))->SetIcon(m_hIcon); ((CButton*)GetDlgItem(IDC_BUTTON_PICKTICKET))->SetIcon(m_hIcon); ((CButton*)GetDlgItem(IDC_BUTTON_PICKDIRECT))->SetIcon(m_hIcon); } // 预览 if (!m_PreviewCtrl.SubclassDlgItem(IDC_PREVIEW, this)) return FALSE; // 模型图纸空间 int nTileMode = 1; VERIFY(xg_getvar(_T("TILEMODE"), &nTileMode)==RTNORM); if (nTileMode == 0) m_bSpace = 1; else m_bSpace = 0; // 读取保存值 ReadStoreValue(); // sg add 100907,判断是否有专版定制中的院别信息列表,初始化IDC_COMBO_SECTION_OFFICE中的内容 // begin int nLength = m_lstOfficeInfo.Length(); if (nLength > 0) { m_cmbOffice.ResetContent(); for (int i=0; im_csName; m_cmbOffice.AddString(csName); } // sg add 100916,保存用户上次选择的院别 if (m_nLastOffice > -1 && m_nLastOffice < nLength) { m_cmbOffice.SetCurSel(m_nLastOffice); } else { m_cmbOffice.SetCurSel(0); } // sg add 100908,根据院别信息,得到正确的通长标题栏,根据选择的院,传回来立式图框是否可选择 GetLongTitleBlkName(); // sg modify 100916,控制部分控件不显示 GetDlgItem(IDC_CHECK_TICKET)->EnableWindow(m_bDefaultTicket && !m_bDirect); // 会签栏 GetDlgItem(IDC_BUTTON_PICKTICKET)->EnableWindow(m_bDefaultTicket && !m_bDirect && m_bTicket); GetDlgItem(IDC_CHECK_ADJUNCT)->EnableWindow(m_bDefaultAdjunct && !m_bDirect); // 附件栏 GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bDefaultAdjunct && !m_bDirect&& m_bAdjunct); GetDlgItem(IDC_CHECK_POSITION)->EnableWindow(FALSE); // 右对齐 GetDlgItem(IDC_CHECK_TITLE_STANDARD)->EnableWindow(FALSE); // 标准标题栏 GetDlgItem(IDC_RADIO_RANGE)->EnableWindow(m_bRANGE && !m_bDirect); // 立式 } // end UpdateData(FALSE); UpdateLengthen(); UpdateSpace(); UpdateTitle(); UpdateDirect(); UpdatePreview(); if (m_iCustomSize >= 0) { m_colLenthen.SetCurSel(-1); UpdateStandard(FALSE); } else SetSizeEdit(m_iStandard, m_iLengthen); if (!g_pagegrp.empty()) { DRAWFRAME::PAGEGRPS::const_iterator it = g_pagegrp.begin(); if (it != g_pagegrp.end()) { GetDlgItem(IDC_RADIO_A0)->SetWindowText(it->_grpname); ++it; } else GetDlgItem(IDC_RADIO_A0)->EnableWindow(FALSE); if (it != g_pagegrp.end()) { GetDlgItem(IDC_RADIO_A1)->SetWindowText(it->_grpname); ++it; } else GetDlgItem(IDC_RADIO_A1)->EnableWindow(FALSE); if (it != g_pagegrp.end()) { GetDlgItem(IDC_RADIO_A2)->SetWindowText(it->_grpname); ++it; } else GetDlgItem(IDC_RADIO_A2)->EnableWindow(FALSE); if (it != g_pagegrp.end()) { GetDlgItem(IDC_RADIO_A3)->SetWindowText(it->_grpname); ++it; } else GetDlgItem(IDC_RADIO_A3)->EnableWindow(FALSE); if (it != g_pagegrp.end()) { GetDlgItem(IDC_RADIO_A4)->SetWindowText(it->_grpname); ++it; } else GetDlgItem(IDC_RADIO_A4)->EnableWindow(FALSE); } return true; } // 标准图幅 void CDrawingFrameDlg::OnDataChangeAx() { CDataExchange dx(this, true); DDX_Radio(&dx, IDC_RADIO_A0, m_iStandard); m_colCustomSize.SetCurSel(-1); SetSizeEdit(m_iStandard); m_iLengthen = 0; UpdateLengthen(); // sg add 100908,根据图幅变化,得到正确的通长标题栏 GetLongTitleBlkName(); UpdatePreview(); } // sg add 100908,增加院别选择事件 void CDrawingFrameDlg::OnCbnSelchangeComboOffice() { UpdateData(TRUE); GetLongTitleBlkName(); // sg add 101102,根据GetLongTitleBlkName传回来的信息,控制立式图框是否可选择 GetDlgItem(IDC_RADIO_RANGE)->EnableWindow(m_bRANGE && !m_bDirect); // 没有立式,并且是选择的是立式图框 if (!m_bRANGE && m_iRow==1) { m_iRow = 0; UpdateData(FALSE); GetLongTitleBlkName(); } UpdatePreview(); } // 横式竖式 void CDrawingFrameDlg::OnDataChangeR() { CDataExchange dx(this, true); DDX_Radio(&dx, IDC_RADIO_ROW, m_iRow); // sg add 100908,根据图幅变化,得到正确的通长标题栏 GetLongTitleBlkName(); UpdatePreview(); } // 加长图框 void CDrawingFrameDlg::OnCbnSelchangeComboLenthength() { m_iLengthen = m_colLenthen.GetCurSel(); SetSizeEdit(m_iStandard, m_iLengthen); m_colCustomSize.SetCurSel(-1); UpdateStandard(TRUE); UpdatePreview(); } // 自定义图框 void CDrawingFrameDlg::OnCbnSelchangeComboCustomsize() { CString string; m_iCustomSize = m_colCustomSize.GetCurSel(); if (m_iCustomSize>=0) m_colCustomSize.GetLBText(m_iCustomSize, string); int iPosi = string.Find(_T("*")); int iLen = string.GetLength(); if (iPosi > 0) { m_strLength = string.Left(iPosi); m_strWidth = string.Right(iLen-iPosi-1); m_colLenthen.SetCurSel(-1); UpdateStandard(FALSE); UpdateSize(); UpdatePreview(); } } // 长宽edit void CDrawingFrameDlg::OnEnKillfocusEditLength() { CDataExchange dx(this, true); DDX_Text(&dx, IDC_EDIT_LENGTH, m_strLength); UpdatePreview(); } void CDrawingFrameDlg::OnEnKillfocusEditWidth() { CDataExchange dx(this, true); DDX_Text(&dx, IDC_EDIT_WIDTH, m_strWidth); UpdatePreview(); } void CDrawingFrameDlg::OnEnChangeEditLength() { CDataExchange dx(this, true); DDX_Text(&dx, IDC_EDIT_LENGTH, m_strLength); UpdatePreview(); } void CDrawingFrameDlg::OnEnChangeEditWidth() { CDataExchange dx(this, true); DDX_Text(&dx, IDC_EDIT_WIDTH, m_strWidth); UpdatePreview(); } void CDrawingFrameDlg::OnBnClickedCheckTitleStandard() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_TITLE_STANDARD, m_bStandard); if (m_bStandard) ((CButton*)GetDlgItem(IDC_CHECK_TITLE_LONG))->SetCheck(FALSE); UpdateTitle(); UpdatePreview(); } void CDrawingFrameDlg::OnBnClickedCheckTitleLong() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_TITLE_LONG, m_bLong); if (m_bLong) { ((CButton*)GetDlgItem(IDC_CHECK_TITLE_STANDARD))->SetCheck(FALSE); // sg add 100916,保证通长标题栏正确 GetLongTitleBlkName(); } UpdateTitle(); UpdatePreview(); } void CDrawingFrameDlg::OnBnClickedCheckTicket() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_TICKET, m_bTicket); // sg modify 100916,专版,根据需要控制控件是否显示 if (m_lstOfficeInfo.Length() > 0) { // 只要是专版,会签有无,会签的控件是否可用,只取决于XML GetDlgItem(IDC_BUTTON_PICKTICKET)->EnableWindow(m_bDefaultTicket && !m_bDirect && m_bTicket); } else { GetDlgItem(IDC_BUTTON_PICKTICKET)->EnableWindow(m_bTicket); } UpdatePreview(); } void CDrawingFrameDlg::OnBnClickedCheckAdjunct() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_ADJUNCT, m_bAdjunct); // sg modify 100916,专版,根据需要控制控件是否显示 if (m_lstOfficeInfo.Length() > 0) { GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bDefaultAdjunct && !m_bDirect && m_bAdjunct); } else { GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bAdjunct); } UpdatePreview(); } // 通长标题栏对齐 void CDrawingFrameDlg::OnBnClickedCheckPosition() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_POSITION, m_bPosition); UpdatePreview(); } // 附件栏选择 void CDrawingFrameDlg::OnBnClickedButtonPickadjunct() { GetBlockName(m_strAdjunct); UpdatePreview(); } // 会签栏选择 void CDrawingFrameDlg::OnBnClickedButtonPickticket() { GetBlockName(m_strTichet); UpdatePreview(); } // 标题栏选择 void CDrawingFrameDlg::OnBnClickedButtonPicktitle() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_TITLE_STANDARD, m_bStandard); if (m_bStandard) GetBlockName(m_strStandard); else GetBlockName(m_strLong); UpdatePreview(); } // 图框选择 void CDrawingFrameDlg::OnBnClickedButtonPickdirect() { GetBlockName(m_strDirect); double dwidth(0.0), dhigh(0.0); GetBlockSize(m_strDirect, dwidth, dhigh); m_strLength.Format(_T("%.0f"), dwidth); m_strWidth.Format(_T("%.0f"), dhigh); UpdateSize(FALSE); UpdatePreview(); } // 比例尺 void CDrawingFrameDlg::OnCbnKillfocusComboScale() { CDataExchange dx(this, true); DDX_CBString(&dx, IDC_COMBO_SCALE, m_strScale); } // 空间转换 void CDrawingFrameDlg::OnBnClickedCheckSpace() { UpdateSpace(); UpdatePreview(); } // 直接插入图框 void CDrawingFrameDlg::OnBnClickedCheckDirect() { UpdateDirect(); if (!m_bDirect) { if(m_iCustomSize < 0) { SetSizeEdit(m_iStandard, m_colLenthen.GetCurSel()); } else { CString string; m_colCustomSize.GetLBText(m_iCustomSize, string); int iPosi = string.Find(_T("*")); int iLen = string.GetLength(); if(iPosi > 0) { m_colLenthen.SetCurSel(-1); m_strLength = string.Left(iPosi); m_strWidth = string.Right(iLen-iPosi-1); } } } else { double dwidth(0.0), dhigh(0.0); GetBlockSize(m_strDirect, dwidth, dhigh); m_strLength.Format(_T("%.0f"), dwidth); m_strWidth.Format(_T("%.0f"), dhigh); } UpdateSize(FALSE); UpdatePreview(); } // 刷新尺寸 void CDrawingFrameDlg::UpdateSize(BOOL bSaveAndValidate) { CDataExchange dx(this, bSaveAndValidate); DDX_Text(&dx, IDC_EDIT_LENGTH, m_strLength); DDX_Text(&dx, IDC_EDIT_WIDTH, m_strWidth); } // 刷新图栏 void CDrawingFrameDlg::UpdateTitle() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_TITLE_STANDARD, m_bStandard); DDX_Check(&dx, IDC_CHECK_TITLE_LONG, m_bLong); // sg modify 100916,专版,根据需要控制控件是否显示 if (m_lstOfficeInfo.Length() > 0) { GetDlgItem(IDC_CHECK_ADJUNCT)->EnableWindow(m_bDefaultAdjunct && m_bLong); GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bDefaultAdjunct && m_bLong && m_bAdjunct); GetDlgItem(IDC_CHECK_POSITION)->EnableWindow(FALSE); } else { GetDlgItem(IDC_CHECK_ADJUNCT)->EnableWindow(m_bLong); GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bLong && m_bAdjunct); GetDlgItem(IDC_CHECK_POSITION)->EnableWindow(m_bLong); } GetDlgItem(IDC_BUTTON_PICKTITLE)->EnableWindow(m_bStandard || m_bLong); } // 刷新空间 void CDrawingFrameDlg::UpdateSpace() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_SPACE, m_bSpace); if (m_bSpace) { GetDlgItem(IDC_COMBO_SCALE)->SetWindowText(_T("1")); xg_setvar(_T("TILEMODE"), 0); int cvport=1; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); if (cvport!=1) PSpace(); } else { GetDlgItem(IDC_COMBO_SCALE)->SetWindowText(m_strScale); xg_setvar(_T("TILEMODE"), 1); } GetDlgItem(IDC_COMBO_SCALE)->EnableWindow(!m_bSpace); } // 刷新直接插图框 void CDrawingFrameDlg::UpdateDirect() { CDataExchange dx(this, true); DDX_Check(&dx, IDC_CHECK_DIRECT, m_bDirect); GetDlgItem(IDC_RADIO_A0)->EnableWindow(!m_bDirect && m_bA0); GetDlgItem(IDC_RADIO_A1)->EnableWindow(!m_bDirect && m_bA1); GetDlgItem(IDC_RADIO_A2)->EnableWindow(!m_bDirect && m_bA2); GetDlgItem(IDC_RADIO_A3)->EnableWindow(!m_bDirect && m_bA3); GetDlgItem(IDC_RADIO_A4)->EnableWindow(!m_bDirect && m_bA4); GetDlgItem(IDC_RADIO_ROW)->EnableWindow(!m_bDirect); ((CEdit *)GetDlgItem(IDC_EDIT_LENGTH))->SetReadOnly(m_bDirect); ((CEdit *)GetDlgItem(IDC_EDIT_WIDTH))->SetReadOnly(m_bDirect); GetDlgItem(IDC_COMBO_LENGTHEN)->EnableWindow(!m_bDirect); GetDlgItem(IDC_COMBO_CUSTOMSIZE)->EnableWindow(!m_bDirect); GetDlgItem(IDC_BUTTON_PICKDIRECT)->EnableWindow(m_bDirect); GetDlgItem(IDC_CHECK_TITLE_LONG)->EnableWindow(!m_bDirect); // sg modify 100916,专版,根据需要控制控件是否显示 if (m_lstOfficeInfo.Length() > 0) { GetDlgItem(IDC_RADIO_RANGE)->EnableWindow(m_bRANGE && !m_bDirect); // 立式 GetDlgItem(IDC_CHECK_TITLE_STANDARD)->EnableWindow(FALSE); // 只要是专版,会签有无,会签的控件是否可用,只取决于XML GetDlgItem(IDC_CHECK_TICKET)->EnableWindow(m_bDefaultTicket && !m_bDirect); GetDlgItem(IDC_BUTTON_PICKTICKET)->EnableWindow(m_bDefaultTicket && !m_bDirect && m_bTicket); GetDlgItem(IDC_CHECK_ADJUNCT)->EnableWindow(m_bDefaultAdjunct && !m_bDirect); GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(m_bDefaultAdjunct && !m_bDirect && m_bAdjunct); GetDlgItem(IDC_CHECK_POSITION)->EnableWindow(FALSE); } else // 标准版 { GetDlgItem(IDC_RADIO_RANGE)->EnableWindow(!m_bDirect); GetDlgItem(IDC_CHECK_TITLE_STANDARD)->EnableWindow(!m_bDirect); GetDlgItem(IDC_CHECK_TICKET)->EnableWindow(!m_bDirect); GetDlgItem(IDC_CHECK_ADJUNCT)->EnableWindow(!m_bDirect && m_bLong); GetDlgItem(IDC_CHECK_POSITION)->EnableWindow(!m_bDirect && m_bLong); GetDlgItem(IDC_BUTTON_PICKADJUNCT)->EnableWindow(!m_bDirect && m_bLong && m_bAdjunct); GetDlgItem(IDC_BUTTON_PICKTICKET)->EnableWindow(!m_bDirect && m_bTicket); } GetDlgItem(IDC_BUTTON_PICKTITLE)->EnableWindow(!m_bDirect && (m_bLong || m_bStandard)); } // 刷新图栏加长combobox void CDrawingFrameDlg::UpdateLengthen() { int type = m_iStandard; m_colLenthen.ResetContent(); DRAWFRAME::PAGEGRPS::const_iterator it = g_pagegrp.begin(); std::advance(it, type); for (int i = 0; i < it->_pages.size(); ++i) { m_colLenthen.AddString(it->_pages.at(i)._pagename); } m_colLenthen.SetCurSel(m_iLengthen); } void CDrawingFrameDlg::UpdateStandard(BOOL bSaveAndValidate) { switch(m_iStandard) { case 0 : ((CButton*)GetDlgItem(IDC_RADIO_A0))->SetCheck(bSaveAndValidate); break; case 1 : ((CButton*)GetDlgItem(IDC_RADIO_A1))->SetCheck(bSaveAndValidate); break; case 2 : ((CButton*)GetDlgItem(IDC_RADIO_A2))->SetCheck(bSaveAndValidate); break; case 3 : ((CButton*)GetDlgItem(IDC_RADIO_A3))->SetCheck(bSaveAndValidate); break; case 4 : ((CButton*)GetDlgItem(IDC_RADIO_A4))->SetCheck(bSaveAndValidate); break; } } // 获得尺寸 void CDrawingFrameDlg::SetSizeEdit(int type, int curSel) { if (type < 0 || type > 4) return; double len = 1189; double wid = 841; DRAWFRAME::PAGEGRPS::const_iterator it = g_pagegrp.begin(); std::advance(it, type); const DRAWFRAME::PAGES &pages = it->_pages; if (curSel >= pages.size()) return; wid = pages[curSel]._width; len = pages[curSel]._length; m_strLength.Format(_T("%.0f"), len); m_strWidth.Format(_T("%.0f"), wid); UpdateSize(); } // 获得块名 BOOL CDrawingFrameDlg::GetBlockName(XString &sBlockName) { BeginEditorCommand(); XString sLibFile; CString path = g_sDwbPath; sLibFile << path << _T("Titleframe.TKW"); if(!InvokeTkwMan(sLibFile, TRUE, sBlockName)) { CompleteEditorCommand(); UpdateData(FALSE); //modify by xlc on 07/05/09(图框比例显示不正确) SetDlgItemText(IDC_COMBO_SCALE, m_strScale); return FALSE; } CompleteEditorCommand(); return TRUE; } //wlw 150327查找块中是否有solid填充,09下gsveiw崩溃 BOOL HasSolidFromBlk(AcDbObjectId idBlock) { TADSGePoint3d ptMin, ptMax; OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock); ASSERT(pBlock); AcDbBlockTableRecordIterator* pBlockIterator = NULL; Acad::ErrorStatus es = pBlock->newIterator(pBlockIterator, Adesk::kTrue, Adesk::kFalse); ASSERT(es == Acad::eOk && pBlockIterator); for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEntity = NULL; es = pBlockIterator->getEntity(pEntity, AcDb::kForRead, Adesk::kTrue); ASSERT(es == Acad::eOk); TAcDbObjectPtr obj(pEntity); TADSGePoint3d pt1, pt2; if (pEntity->isKindOf(AcDbHatch::desc())) { CString ssolid = ((AcDbHatch*)pEntity)->patternName(); if (ssolid = _T("SOLID")) { delete pBlockIterator; return TRUE; } } else if (pEntity->isKindOf(AcDbBlockReference::desc())) { AcDbBlockReference *pInsert = AcDbBlockReference::cast(pEntity); if (HasSolidFromBlk(pInsert->blockTableRecord())) { delete pBlockIterator; return TRUE; } } } delete pBlockIterator; OPENOBJ_END(); return FALSE; } // 刷新预览图 void CDrawingFrameDlg::UpdatePreview() { m_PreviewCtrl.clearAll(); m_PreviewCtrl.init(true); AcDbBlockTableRecord *pBTRecord = NULL; if(acdbOpenObject(pBTRecord, m_idOldBlock, AcDb::kForWrite) == Acad::eOk) { pBTRecord->erase(); pBTRecord->close(); } AcDbBlockTable *pBlockTab = NULL; if (m_PreviewDb.getSymbolTable(pBlockTab, AcDb::kForWrite)!=Acad::eOk) return; AcDbBlockTableRecord *pBlockTabRecord = new AcDbBlockTableRecord; pBlockTabRecord->setName(_T("*U")); pBlockTab->add(m_idOldBlock, pBlockTabRecord); pBlockTab->close(); AcGePoint3d ptIns(0,0,0); double width(0.0), high(0.0); if (m_bDirect) //InsertFrame(pBlockTabRecord, ptIns, width, high); wlw mod2015.02.11 该代码无法实现批量入库时的正确预览 { #if ADS<18 AcDbObjectId idLayer = InitLayer(LAY_BORDER); #else AcDbObjectId idLayer = InitLayer(LAY_BORDER,m_bPreview?&m_PreviewDb:acdbCurDwg()); #endif if (g_nAcadVer >17.11 && g_nAcadVer < 17.21) {//wlw 150327查找块中是否有solid填充,09下gsveiw崩溃 XString sBlock; if (LoadDwbBlock(m_strDirect,sBlock)!=RTNORM) return; AcDbObjectId BlockId = InitBlock(sBlock); if (HasSolidFromBlk(BlockId)) return; } XString sBlock; if (LoadDwbBlock(m_strDirect,sBlock,&m_PreviewDb)!=RTNORM) return; AcDbObjectId BlockId = InitBlock(sBlock,&m_PreviewDb); AcDbBlockReference *pBlockRef = new AcDbBlockReference; pBlockRef->setBlockTableRecord(BlockId); pBlockRef->setPosition(ptIns); pBlockRef->setRotation(0); pBlockRef->setLayer(idLayer); Acad::ErrorStatus es=pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), pBlockRef); AcDbExtents extents; pBlockRef->getGeomExtents(extents); ptIns.x = (extents.maxPoint().x + extents.minPoint().x) * .5; ptIns.y = (extents.maxPoint().y + extents.minPoint().y) * .5; width = extents.maxPoint().x - extents.minPoint().x + 20; high = extents.maxPoint().y - extents.minPoint().y + 20; if (es == Acad::eOk) pBlockRef->close(); else { delete pBlockRef; } } else { DrawFrame(pBlockTabRecord, ptIns, width, high); } AcGePoint3d target = ptIns; AcGePoint3d position(target.x, target.y, 1); m_PreviewCtrl.view()->setView(position, target, AcGeVector3d(0, 1, 0), width, high); m_PreviewCtrl.view()->add(pBlockTabRecord,m_PreviewCtrl.model()); pBlockTabRecord->close(); m_PreviewCtrl.Invalidate(); } CString CDrawingFrameDlg::GetSizeDesc()//... { double dWid = _tstof(m_strWidth); double dLen = _tstof(m_strLength); DRAWFRAME::PAGEGRPS::const_iterator grpit = g_pagegrp.begin(); for (; grpit != g_pagegrp.end(); ++grpit) { const DRAWFRAME::PAGES &pages = grpit->_pages; DRAWFRAME::PAGES::const_iterator pageit = pages.begin(); for (; pageit != pages.end(); ++pageit) { const DRAWFRAME::STPage &page = *pageit; if (fabs(dWid - page._width) < 1.0E-6 && fabs(dLen - page._length) < 1.0E-6) return page._pagename; } } CString szSize = m_strLength + _T("*") + m_strWidth; return szSize; } // 直接插入图框 void CDrawingFrameDlg::InsertFrame(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns, double &width, double &high) { //modify by xlc on 090917 解决2010平台预览显示不出来的问题 #if ADS<18 AcDbObjectId idLayer = InitLayer(LAY_BORDER); #else AcDbObjectId idLayer = InitLayer(LAY_BORDER,m_bPreview?&m_PreviewDb:acdbCurDwg()); #endif double dwidth = _tstof(m_strLength); double dhigh = _tstof(m_strWidth); AcGePoint3d ptLowRight; ptLowRight.x = ptIns.x + 0.5 * dwidth; ptLowRight.y = ptIns.y - 0.5 * dhigh; width = dwidth + 25; high = dhigh + 25; InsertBlock(pBlockTabRecord, m_strDirect, ptLowRight, 0, idLayer); if (!m_bPreview) { Entity ent; ent.GetLast(); SaveFrameSize(ent,GetSizeDesc()); } else { m_strLength.Format(_T("%.0f"), dwidth); m_strWidth.Format(_T("%.0f"), dhigh); } } // 绘制图框 void CDrawingFrameDlg::DrawFrame(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns, double &width, double &high, int flag) { //modify by xlc on 090917 解决2010平台预览显示不出来的问题 #if ADS<18 AcDbObjectId idLayer = InitLayer(LAY_BORDER); #else AcDbObjectId idLayer = InitLayer(LAY_BORDER,m_bPreview?&m_PreviewDb:acdbCurDwg()); #endif double widthOut; double highOut; if (m_iRow == 0) { widthOut = _tstof(m_strLength); highOut = _tstof(m_strWidth); } else { widthOut = _tstof(m_strWidth); highOut = _tstof(m_strLength); } XPoint ptCenOut = ptIns; XRectAngle boxOut(ptCenOut, widthOut, highOut); AcDbPolyline *plineOut = new AcDbPolyline; plineOut->addVertexAt(0, boxOut.GetLowLeft().AsAcGePoint2d()); plineOut->addVertexAt(1, boxOut.GetLowRight().AsAcGePoint2d()); plineOut->addVertexAt(2, boxOut.GetUpRight().AsAcGePoint2d()); plineOut->addVertexAt(3, boxOut.GetUpLeft().AsAcGePoint2d()); plineOut->setClosed(Adesk::kTrue); if (flag == 0) plineOut->setConstantWidth(0.0); plineOut->setLayer(idLayer); Acad::ErrorStatus es=pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), plineOut); if (es == Acad::eOk) plineOut->close(); else { delete plineOut; } double dEdge1 = 25; double dEdge2 = 10; if (m_iStandard == 3 || m_iStandard == 4) dEdge2 = 5; double widthIn; double highIn; XPoint ptCenIn; if (m_iRow == 0) { widthIn = widthOut - dEdge1 - dEdge2; highIn = highOut - 2 * dEdge2; ptCenIn.x = ptCenOut.x + 0.5 * (dEdge1 - dEdge2); ptCenIn.y = ptCenOut.y; } else { widthIn = widthOut - 2 * dEdge2; highIn = highOut - dEdge1 - dEdge2; ptCenIn.x = ptCenOut.x; ptCenIn.y = ptCenOut.y - 0.5 * (dEdge1 - dEdge2); } XRectAngle boxIn(ptCenIn, widthIn, highIn); AcDbPolyline *plineIn = new AcDbPolyline; plineIn->addVertexAt(0, boxIn.GetLowLeft().AsAcGePoint2d()); plineIn->addVertexAt(1, boxIn.GetLowRight().AsAcGePoint2d()); plineIn->addVertexAt(2, boxIn.GetUpRight().AsAcGePoint2d()); plineIn->addVertexAt(3, boxIn.GetUpLeft().AsAcGePoint2d()); plineIn->setClosed(Adesk::kTrue); if (flag==0) { // sg modify 111021,在专版软件中,根据图幅支持设置图框的线宽 if (m_lstOfficeInfo.Length()>0 && m_aryFrameWidth.length()==5) { double dWidth = m_aryFrameWidth.at(m_iStandard); plineIn->setConstantWidth(dWidth); } else // 标准版,或者图幅宽度信息不够 { plineIn->setConstantWidth(1.0); } } plineIn->setLayer(idLayer); es = pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), plineIn); if (es == Acad::eOk) plineIn->close(); else { delete plineIn; } width = widthOut + dEdge1; high = highOut + dEdge1; // 会签栏 // sg modify 111014,如果是专版,根据XML确定是否绘制会签,m_bDefaultTicket值只从XML文件中读取,用户不能通过对话来改,比较稳定 //if (m_bTicket && m_strTichet.Length() > 0) if (m_bDefaultTicket && m_bTicket && m_strTichet.Length() > 0) { AcGePoint3d ptTichet = boxIn.GetUpLeft().AsAcGePoint3d(); double angle = PI/2; if (m_iRow == 1) { ptTichet = boxIn.GetUpRight().AsAcGePoint3d(); angle = 0; } if (flag == 1) { InsertBlock(pBlockTabRecord, m_strTichet, ptTichet, angle, idLayer); DrawInsertPoint(pBlockTabRecord, ptTichet); } } // 标准标题栏 if (m_bStandard && m_strStandard.Length() > 0) { AcGePoint3d ptTitle = boxIn.GetLowRight().AsAcGePoint3d(); if (flag == 1) { InsertBlock(pBlockTabRecord, m_strStandard, ptTitle, 0, idLayer); DrawInsertPoint(pBlockTabRecord, ptTitle); } } // 通长标题栏 if (m_bLong && m_strLong.Length() > 0) { AcGePoint3d ptLowRight = boxIn.GetLowRight().AsAcGePoint3d(); double dwidth = 0.0; double dhigh = 0.0; GetBlockSize(m_strLong, dwidth, dhigh); AcGePoint2d ptSta, ptEnd; if (dwidth > dhigh) { ptSta.x = ptLowRight.x; ptSta.y = ptLowRight.y + dhigh; ptEnd.x = ptLowRight.x - widthIn; ptEnd.y = ptLowRight.y + dhigh; } else { ptSta.x = ptLowRight.x - dwidth; ptSta.y = ptLowRight.y; ptEnd.x = ptLowRight.x - dwidth; ptEnd.y = ptLowRight.y + highIn; } // sg add 111021,根据SR和HX的要求,以后在专版软件中,不再绘制这个竖线,在图块制作的时候,直接绘制粗线 if (m_lstOfficeInfo.Length() < 1) { //AcDbLine *pline = new AcDbLine(ptSta, ptEnd); AcDbPolyline *pline=new AcDbPolyline; pline->addVertexAt(0,ptSta); pline->addVertexAt(1,ptEnd); pline->setLayer(idLayer); if (flag==0) pline->setConstantWidth(0.8); es = pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), pline); if (es == Acad::eOk) pline->close(); else { delete pline; } } // 通常横栏左对齐 AcGePoint3d ptTitle = ptLowRight; if (dwidth > dhigh && !m_bPosition) { ptTitle.x -= widthIn - dwidth; } if (flag == 1) { InsertBlock(pBlockTabRecord, m_strLong, ptTitle, 0, idLayer); DrawInsertPoint(pBlockTabRecord, ptTitle); } // 附件栏 if (m_bDefaultAdjunct && m_bAdjunct && m_strAdjunct.Length() > 0) { double dwidthAd = 0.0; double dhighAd = 0.0; GetBlockSize(m_strAdjunct, dwidthAd, dhighAd); AcGePoint3d ptAdjunct = ptLowRight; if (dwidth > dhigh) { if (m_bPosition) ptAdjunct.x -= widthIn - dwidthAd; } else ptAdjunct.y += highIn - dhighAd; if (flag == 1) { InsertBlock(pBlockTabRecord, m_strAdjunct, ptAdjunct, 0, idLayer); DrawInsertPoint(pBlockTabRecord, ptAdjunct); } } } } // 绘制图框 void CDrawingFrameDlg::DrawFrameBlock(AcGePoint3d ptIns,double &width, double &high) { //modify by xlc on 090917 解决2010平台预览显示不出来的问题 #if ADS<18 AcDbObjectId idLayer = InitLayer(LAY_BORDER); #else AcDbObjectId idLayer = InitLayer(LAY_BORDER,m_bPreview?&m_PreviewDb:acdbCurDwg()); #endif double widthOut; double highOut; if (m_iRow == 0) { widthOut = _tstof(m_strLength); highOut = _tstof(m_strWidth); } else { widthOut = _tstof(m_strWidth); highOut = _tstof(m_strLength); } XPoint ptCenOut = ptIns; XRectAngle boxOut(ptCenOut, widthOut, highOut); double dEdge1 = 25; double dEdge2 = 10; if (m_iStandard == 3 || m_iStandard == 4) dEdge2 = 5; double widthIn; double highIn; XPoint ptCenIn; if (m_iRow == 0) { widthIn = widthOut - dEdge1 - dEdge2; highIn = highOut - 2 * dEdge2; ptCenIn.x = ptCenOut.x + 0.5 * (dEdge1 - dEdge2); ptCenIn.y = ptCenOut.y; } else { widthIn = widthOut - 2 * dEdge2; highIn = highOut - dEdge1 - dEdge2; ptCenIn.x = ptCenOut.x; ptCenIn.y = ptCenOut.y - 0.5 * (dEdge1 - dEdge2); } XRectAngle boxIn(ptCenIn, widthIn, highIn); width = widthOut + dEdge1; high = highOut + dEdge1; // sg add 111102,根据选择的下属院别,并返回对中标记图块名称 XString szUpDownBlock, szLeftBlock, szRightBlock; if (GetMidAlignBlock(szUpDownBlock, szLeftBlock, szRightBlock)) { XPoint ptMidBlockLoc; ptMidBlockLoc.x = ptCenOut.x; ptMidBlockLoc.y = ptCenOut.y + 0.5 * highOut; if (szUpDownBlock.Length() != 0) InsertBlock(NULL, szUpDownBlock, ptMidBlockLoc, 0, idLayer); // 上 ptMidBlockLoc.y -= highOut; if (szUpDownBlock.Length() != 0) InsertBlock(NULL, szUpDownBlock, ptMidBlockLoc, PI, idLayer); // 下 ptMidBlockLoc.x = ptCenOut.x - 0.5 * widthOut; ptMidBlockLoc.y = ptCenOut.y; if (szLeftBlock.Length() != 0) InsertBlock(NULL, szLeftBlock, ptMidBlockLoc, 0, idLayer); // 左 ptMidBlockLoc.x += widthOut; if (szRightBlock.Length() != 0) { if (_tcsicmp(szRightBlock, szUpDownBlock) == 0) // 对“上下图块”和“右图块”的名字进行判断,如果是一个名的话,说明是一个块,需要转一个角度 { InsertBlock(NULL, szRightBlock, ptMidBlockLoc, PI*1.5, idLayer); // 右 } else // 如果不是一个块的话,直接输出,不需要转换角度 { InsertBlock(NULL, szRightBlock, ptMidBlockLoc, 0, idLayer); // 右 } } } // 会签栏 // sg modify 111014,如果是专版,根据XML确定是否绘制会签,m_bDefaultTicket值只从XML文件中读取,用户不能通过对话来改,比较稳定 //if (m_bTicket && m_strTichet.Length() > 0) if (m_bDefaultTicket && m_bTicket && m_strTichet.Length() > 0) { AcGePoint3d ptTichet = boxIn.GetUpLeft().AsAcGePoint3d(); double angle = PI/2; if (m_iRow == 1) { ptTichet = boxIn.GetUpRight().AsAcGePoint3d(); angle = 0; } InsertBlock(NULL, m_strTichet, ptTichet, angle, idLayer); } // 标准标题栏 if (m_bStandard && m_strStandard.Length() > 0) { AcGePoint3d ptTitle = boxIn.GetLowRight().AsAcGePoint3d(); InsertBlock(NULL, m_strStandard, ptTitle, 0, idLayer); Entity ent; ent.GetLast(); SaveFrameSize(ent,GetSizeDesc()); } // 通长标题栏 if (m_bLong && m_strLong.Length() > 0) { AcGePoint3d ptLowRight = boxIn.GetLowRight().AsAcGePoint3d(); double dwidth = 0.0; double dhigh = 0.0; GetBlockSize(m_strLong, dwidth, dhigh); AcGePoint2d ptSta, ptEnd; if (dwidth > dhigh) { ptSta.x = ptLowRight.x; ptSta.y = ptLowRight.y + dhigh; ptEnd.x = ptLowRight.x - widthIn; ptEnd.y = ptLowRight.y + dhigh; } else { ptSta.x = ptLowRight.x - dwidth; ptSta.y = ptLowRight.y; ptEnd.x = ptLowRight.x - dwidth; ptEnd.y = ptLowRight.y + highIn; } // 通常横栏左对齐 AcGePoint3d ptTitle = ptLowRight; if (dwidth > dhigh && !m_bPosition) { ptTitle.x -= widthIn - dwidth; } InsertBlock(NULL, m_strLong, ptTitle, 0, idLayer); Entity ent; ent.GetLast(); SaveFrameSize(ent,GetSizeDesc()); // 附件栏 if (m_bAdjunct && m_strAdjunct.Length() > 0) { double dwidthAd = 0.0; double dhighAd = 0.0; GetBlockSize(m_strAdjunct, dwidthAd, dhighAd); AcGePoint3d ptAdjunct = ptLowRight; if (dwidth > dhigh) { if (m_bPosition) ptAdjunct.x -= widthIn - dwidthAd; } else ptAdjunct.y += highIn - dhighAd; InsertBlock(NULL, m_strAdjunct, ptAdjunct, 0, idLayer); } } } void CDrawingFrameDlg::DrawInsertPoint(AcDbBlockTableRecord *pBlockTabRecord, AcGePoint3d ptIns) { double dLen = 8; AcGePoint3d ptLowLeft, ptLowRight, ptUpRight, ptUpLeft; ptLowLeft.x = ptIns.x - dLen; ptLowLeft.y = ptIns.y - dLen; ptLowRight.x = ptIns.x + dLen; ptLowRight.y = ptIns.y - dLen; ptUpRight.x = ptIns.x + dLen; ptUpRight.y = ptIns.y + dLen; ptUpLeft.x = ptIns.x - dLen; ptUpLeft.y = ptIns.y + dLen; AcDbLine *pline1 = new AcDbLine(ptLowLeft, ptUpRight); pline1->setColorIndex(1); pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), pline1); pline1->close(); AcDbLine *pline2 = new AcDbLine(ptLowRight, ptUpLeft); pline2->setColorIndex(1); pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), pline2); pline2->close(); } //模拟insert命令,可以处理属性 void NewInsertInCurrentSpace(AcDbObjectId idBlockRecord,AcGePoint3d ptIns,AcGeScale3d scale,double angle) { AcDbBlockReference *pBlockRef = new AcDbBlockReference; pBlockRef->setBlockTableRecord(idBlockRecord); pBlockRef->setPosition(ptIns); pBlockRef->setScaleFactors(scale); pBlockRef->setRotation(angle); AddToCurrentSpace(pBlockRef,Adesk::kFalse); AcDbBlockTableRecord *pBlockRecord=NULL; acdbOpenObject(pBlockRecord,idBlockRecord,AcDb::kForRead); if (pBlockRecord!=NULL) { if (pBlockRecord->hasAttributeDefinitions())//有属性 { AcDbBlockTableRecordIterator *pIter=NULL; pBlockRecord->newIterator(pIter); if (pIter!=NULL) { AcGeMatrix3d mat=pBlockRef->blockTransform(); for(pIter->start();!pIter->done();pIter->step()) { AcDbEntity *pEnt=NULL; pIter->getEntity(pEnt,AcDb::kForRead); if (pEnt!=NULL) { AcDbAttributeDefinition*pAttDef=AcDbAttributeDefinition::cast(pEnt); if (pAttDef!=NULL) { AcDbAttribute *pAttr=new AcDbAttribute; pAttr->setAttributeFromBlock(pAttDef,mat); pBlockRef->appendAttribute(pAttr); pAttr->close(); } pEnt->close(); } } delete pIter; } } pBlockRecord->close(); } pBlockRef->close(); } // 插入块 void CDrawingFrameDlg::InsertBlock(AcDbBlockTableRecord *pBlockTabRecord, XString sBlockName, AcGePoint3d ptIns, double angle, AcDbObjectId idLayer) { if (sBlockName==_T(""))//add by whl on 070516 return; AcDbObjectId BlockId; XString sBlock(256); if (m_bPreview) { if (LoadDwbBlock(sBlockName,sBlock,&m_PreviewDb)!=RTNORM) return; } else { if (LoadDwbBlock(sBlockName, sBlock)!=RTNORM) return; } if (m_bPreview) { BlockId = InitBlock(sBlock,&m_PreviewDb); AcDbBlockReference *pBlockRef = new AcDbBlockReference; pBlockRef->setBlockTableRecord(BlockId); pBlockRef->setPosition(ptIns); pBlockRef->setRotation(angle); pBlockRef->setLayer(idLayer); Acad::ErrorStatus es=pBlockTabRecord->appendAcDbEntity(AcDbObjectId(), pBlockRef); if (es == Acad::eOk) pBlockRef->close(); else { delete pBlockRef; } } else { XPushVarStr vTempLay(_T("CLAYER"),LAY_BORDER); extern TARCH_IMPEXP double g_nAcadVer; if (g_nAcadVer>17.11)//2009 NewInsertInCurrentSpace(InitBlock(sBlock),ptIns,AcGeScale3d(1.0,1.0,1.0),angle); else//旧方法,会导致2009下DragMovePickset出问题(不动态移动) { XPushVar vTemp(_T("OSMODE"),0); XPushVar attreq(_T("ATTREQ"), 0); XPoint ptBase(ptIns.x,ptIns.y,ptIns.z); ptBase=Wcs2Ucs(ptBase); ads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR *)sBlock, RT3DPOINT, &ptBase, RTREAL, 1.0, RTREAL, 1.0,RTREAL,(angle-Ucs2Wcs(0.0))*180/PI,RTNONE); } } } // 获得块尺寸 void CDrawingFrameDlg::GetBlockSize(XString sBlockName, double &width, double &high) { if (sBlockName==_T(""))//add by whl on 070516 return; AcDbObjectId BlockId; XString sBlock(256); if (m_bPreview) { if (LoadDwbBlock(sBlockName,sBlock,&m_PreviewDb)!=RTNORM) return; } else { if (LoadDwbBlock(sBlockName, sBlock)!=RTNORM) return; } BlockId = InitBlock(sBlock,m_bPreview?&m_PreviewDb:NULL); AcDbExtents ext; AcDbBlockReference blockRef; blockRef.setBlockTableRecord(BlockId); //modify by xlc on 081113 图框尺寸计算不准确 //blockRef.geomExtentsBestFit(ext); blockRef.getGeomExtents(ext); AcGePoint3d maxPt, minPt; maxPt = ext.maxPoint(); minPt = ext.minPoint(); width = maxPt.x - minPt.x; high = maxPt.y - minPt.y; } BOOL CDrawingFrameDlg::DestroyWindow() { m_PreviewCtrl.clearAll(); return CAcUiDialog::DestroyWindow(); } // 读入历史数据 void CDrawingFrameDlg::ReadStoreValue() { CodeBase db; XString fullFile; if (!FindFile(_T("DataStore.dbf"), fullFile)){ AfxMessageBox(_T("对不起,没有发现DataStore.dbf文件!")); return; } int Number; CString strType, strValue; CString remark; XDbfTable *pTable = db.Open(fullFile); if (pTable == NULL) { acutPrintf(_T("\n打开文件%s失败!\n"), fullFile); return; } pTable->MoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), strType); GET_FIELD(pTable, _T("TypeValue"), strValue); GET_FIELD(pTable, _T("REMARK"), remark); if (Number != 20) { pTable->MoveNext(); continue; } strValue.TrimLeft(); strValue.TrimRight(); if (_tcscmp(strValue, _T("标准图幅")) == 0) m_iStandard = _ttoi(remark); else if (_tcscmp(strValue, _T("加长图幅")) == 0) m_iLengthen = _ttoi(remark); else if (_tcscmp(strValue, _T("横立式")) == 0) m_iRow = _ttoi(remark); else if (_tcscmp(strValue, _T("图长")) == 0) m_strLength = remark; else if (_tcscmp(strValue, _T("图宽")) == 0) m_strWidth = remark; else if (_tcscmp(strValue, _T("标准标题栏")) == 0) { int length = remark.GetLength(); int position = remark.Find(_T("-")); m_bStandard = _ttoi(remark.Left(1)); m_strStandard = remark.Right(length - position - 1); } else if (_tcscmp(strValue, _T("通长标题栏")) == 0) { int length = remark.GetLength(); int position = remark.Find(_T("-")); m_bLong = _ttoi(remark.Left(1)); m_strLong = remark.Right(length - position - 1); } else if (_tcscmp(strValue, _T("右对齐")) == 0) { m_bPosition = _ttoi(remark); } else if (_tcscmp(strValue, _T("附件栏")) == 0) { int length = remark.GetLength(); int position = remark.Find(_T("-")); m_bAdjunct = _ttoi(remark.Left(1)); m_strAdjunct = remark.Right(length - position - 1); } else if (_tcscmp(strValue, _T("会签栏")) == 0) { int length = remark.GetLength(); int position = remark.Find(_T("-")); m_bTicket = _ttoi(remark.Left(1)); m_strTichet = remark.Right(length - position - 1); } else if (_tcscmp(strValue, _T("直接插图框")) == 0) { int length = remark.GetLength(); int position = remark.Find(_T("-")); m_bDirect = _ttoi(remark.Left(1)); m_strDirect = remark.Right(length - position - 1); } else if (_tcscmp(strValue, _T("比例尺")) == 0) m_strScale = remark; pTable->MoveNext(); } // 自定义图幅 if (pTable->MoveTo(_T("TypeValue"), _T("$当前自定义图框"))) GET_FIELD(pTable, _T("REMARK"), m_iCustomSize); int iCount = 0; if (pTable->MoveTo(_T("TypeValue"), _T("$自定义图幅数"))) GET_FIELD(pTable, _T("REMARK"), iCount); CString strCusValue, strCusRemark; for(long i=0; iMoveTo(_T("TypeValue"), strCusValue)) { GET_FIELD(pTable, _T("REMARK"), strCusRemark); if (m_colCustomSize.FindString(-1, strCusRemark) == CB_ERR) { if (!strCusRemark.IsEmpty()) m_colCustomSize.AddString(strCusRemark); } } } pTable->Close(); } // 写出数据 void CDrawingFrameDlg::WriteStoreValue() { CodeBase db; XString fullFile; if (!FindFile(_T("DataStore.dbf"), fullFile)){ AfxMessageBox(_T("对不起,没有发现DataStore.dbf文件!")); return; } int Number; CString strType, strValue; XDbfTable *pTable = db.Open(fullFile); if (pTable == NULL) { acutPrintf(_T("\n打开文件%s失败!"), fullFile); return; } pTable->MoveFirst(); while(!pTable->IsEOF()) { GET_FIELD(pTable, _T("TypeNumber"), Number); GET_FIELD(pTable, _T("TypeName"), strType); GET_FIELD(pTable, _T("TypeValue"), strValue); if (Number != 20) { pTable->MoveNext(); continue; } CString str; strValue.TrimLeft(); strValue.TrimRight(); if (_tcscmp(strValue, _T("标准图幅")) == 0) { SET_FIELD(pTable, _T("REMARK"), m_iStandard); } else if (_tcscmp(strValue, _T("加长图幅")) == 0) { SET_FIELD(pTable, _T("REMARK"), m_iLengthen); } else if (_tcscmp(strValue, _T("横立式")) == 0) { SET_FIELD(pTable, _T("REMARK"), m_iRow); } else if (_tcscmp(strValue, _T("图长")) == 0) { SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) m_strLength); } else if (_tcscmp(strValue, _T("图宽")) == 0) { SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) m_strWidth); } else if (_tcscmp(strValue, _T("标准标题栏")) == 0) { str.Format(_T("%d-%s"), m_bStandard, m_strStandard); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } else if (_tcscmp(strValue, _T("通长标题栏")) == 0) { str.Format(_T("%d-%s"), m_bLong, m_strLong); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } else if (_tcscmp(strValue, _T("右对齐")) == 0) { SET_FIELD(pTable, _T("REMARK"), m_bPosition); } else if (_tcscmp(strValue, _T("附件栏")) == 0) { str.Format(_T("%d-%s"), m_bAdjunct, m_strAdjunct); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } else if (_tcscmp(strValue, _T("会签栏")) == 0) { str.Format(_T("%d-%s"), m_bTicket, m_strTichet); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } else if (_tcscmp(strValue, _T("直接插图框")) == 0) { str.Format(_T("%d-%s"), m_bDirect, m_strDirect); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } else if (_tcscmp(strValue, _T("比例尺")) == 0) { if (!m_bSpace) { str.Format(_T("%s"), m_strScale); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) str); } } pTable->MoveNext(); } BOOL bWFlag = FALSE; BOOL bHFlag = FALSE; double wid = _tstof(m_strWidth); double len = _tstof(m_strLength); DRAWFRAME::PAGEGRPS::const_iterator grpit = g_pagegrp.begin(); for (; grpit != g_pagegrp.end(); ++grpit) { if (fabs(wid - grpit->_width) < 1.0e-6) { bWFlag = TRUE; const DRAWFRAME::PAGES &pages = grpit->_pages; DRAWFRAME::PAGES::const_iterator pageit = pages.begin(); for (; pageit != pages.end(); ++pageit) { const DRAWFRAME::STPage &page = *pageit; if (fabs(len - page._length) < 1.0E-6) { bHFlag = TRUE; break; } } break; } } long iCount = m_colCustomSize.GetCount(); CString strCusValue, strCusRemark; strCusRemark.Format(_T("%s*%s"), m_strLength, m_strWidth); int iRet = m_colCustomSize.FindString(-1, strCusRemark); if (!bWFlag || !bHFlag) { if (iRet == CB_ERR) { m_colCustomSize.InsertString(0,strCusRemark); long count=min(10,m_colCustomSize.GetCount()); if (pTable->MoveTo(_T("TypeValue"), _T("$自定义图幅数"))) SET_FIELD(pTable, _T("REMARK"), count); for(long i=0;iMoveTo(_T("TypeValue"),strCusValue)) { pTable->AppendEnd(); pTable->MoveLast(); } CString temp; m_colCustomSize.GetLBText(i,temp); SET_FIELD(pTable, _T("TypeNumber"), 20); SET_FIELD(pTable, _T("TypeName"), _T("图框")); SET_FIELD(pTable, _T("TypeValue"), (const TCHAR*) strCusValue); SET_FIELD(pTable, _T("REMARK"), (const TCHAR*) temp); } iRet=0; } if(pTable->MoveTo(_T("TypeValue"), _T("$当前自定义图框"))) SET_FIELD(pTable, _T("REMARK"), iRet); } else { if (pTable->MoveTo(_T("TypeValue"), _T("$当前自定义图框"))) SET_FIELD(pTable, _T("REMARK"), -1); } pTable->Close(); } void CDrawingFrameDlg::OnOK() { BeginEditorCommand(); m_bPreview=false; CPoint ptCursor; XPoint ptIns; if (GetCursorPos(&ptCursor)) { acedGetAcadDwgView()->ScreenToClient(&ptCursor); acedCoordFromPixelToWorld(ptCursor, ptIns); } PickSet ss(SS_FREE); ss.IncludeBegin(); double width, high; if (m_bDirect) InsertFrame(NULL, ptIns.AsAcGePoint3d(), width, high); else { AcDbBlockTable *pTable = NULL; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pTable, AcDb::kForRead); AcDbBlockTableRecord *pTabRecord = NULL; pTable->getAt((m_bSpace)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pTabRecord, AcDb::kForWrite); pTable->close(); DrawFrame(pTabRecord, ptIns.AsAcGePoint3d(), width, high, 0); pTabRecord->close(); DrawFrameBlock(ptIns.AsAcGePoint3d(),width,high); } ss.IncludeEnd(); //wlw 13.1.6 修改图框插入的点 //if (m_bSpace)//图纸空间时基点在左下角 ss.GetExtend(ptIns,XPoint()); ptIns.z = 0.0;//wlw 14.6.17 修改图框插入的点为0标高 ptIns = Wcs2Ucs(ptIns); { XPushVar osmode(_T("OSMODE"), 0); // Zyu modify on 100721,支持64位 //acedCommand(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &ptIns, RTREAL, Ucs2Wcs(0.0)*180/PI, RTNONE); acedCommand(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &ptIns, RTREAL, Ucs2Wcs(0.0)*180/PI, RTNONE); double scale = _tstof(m_strScale); if (!m_bSpace && scale > 0.0) { // Zyu modify on 100721,支持64位 //acedCommand(RTSTR, _T(".SCALE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, &ptIns, RTREAL, scale, RTNONE); acedCommand(RTSTR, _T(".SCALE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &ptIns, RTREAL, scale, RTNONE); } } int nRet=RTNORM; if (!m_bSpace) { //wlw 13.1.6 修改图框插入模式 //nRet= DragMovePickSet(ss, _T("\n请点取插入位置<返回>: "), ptIns, XPoint()); nRet= DragPickSet(ss, ptIns); } else nRet= DragMovePickSet(ss,_T("\n请点取插入位置或 [原点(Z)]<返回>:"),ptIns,XPoint(),_T("Z")); if (nRet == RTCAN) { ss.Delete(); CancelEditorCommand(); } else if (nRet==RTNONE) { ss.Delete(); CompleteEditorCommand(); } else if (nRet==RTKWORD)//插在原点 { // Zyu modify on 100721,支持64位 //acedCommand(RTSTR,_T(".MOVE"),RTPICKS,(long*)ss,RTSTR,_T(""),RT3DPOINT,&ptIns, // RT3DPOINT,&XPoint(),RTNONE); acedCommand(RTSTR,_T(".MOVE"),RTPICKS,(TLong_ptr *)ss,RTSTR,_T(""),RT3DPOINT,&ptIns, RT3DPOINT,&XPoint(),RTNONE); WriteStoreValue(); CAcUiDialog::OnOK(); } else { WriteStoreValue(); CAcUiDialog::OnOK(); } m_bPreview=true; } void DrawingFrame() { CAcModuleResourceOverride vTemp; CDrawingFrameDlg dlg; dlg.DoModal(); } ////////////////////////////////////////////////////////////////////////// #define NODE_GROUP _T("GROUP") #define NODE_PAGE _T("PAGE") #define ATTR_NAME _T("name") #define ATTR_IDX _T("idx") #define ATTR_WIDTH _T("width") #define ATTR_LENGTH _T("length") static int init_func() { DRAWFRAME::InitPageGrp(); return 1; } void DRAWFRAME::default_init_func() { DRAWFRAME::PAGES pages; pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0"), 841, 1189)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+1/8"), 841, 1338)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+1/4"), 841, 1486)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+3/8"), 841, 1635)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+1/2"), 841, 1783)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+5/8"), 841, 1932)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+3/4"), 841, 2080)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+7/8"), 841, 2230)); pages.push_back(DRAWFRAME::STPage(_T("A0"), _T("A0+1"), 841, 2378)); g_pagegrp.insert(DRAWFRAME::STPageGrp(1, _T("A0"), 841, pages)); pages.clear(); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1"), 594, 841)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+1/4"), 594, 1051)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+1/2"), 594, 1261)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+3/4"), 594, 1471)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+1"), 594, 1682)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+5/4"), 594, 1892)); pages.push_back(DRAWFRAME::STPage(_T("A1"), _T("A1+3/2"), 594, 2102)); g_pagegrp.insert(DRAWFRAME::STPageGrp(2, _T("A1"), 594, pages)); pages.clear(); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2"), 420, 594)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+1/4"), 420, 743)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+1/2"), 420, 891)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+3/4"), 420, 1041)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+1"), 420, 1189)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+4/5"), 420, 1338)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+3/2"), 420, 1486)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+7/4"), 420, 1635)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+2"), 420, 1783)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+9/4"), 420, 1932)); pages.push_back(DRAWFRAME::STPage(_T("A2"), _T("A2+5/2"), 420, 2080)); g_pagegrp.insert(DRAWFRAME::STPageGrp(3, _T("A2"), 420, pages)); pages.clear(); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3"), 297, 420)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+1/2"), 297, 630)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+1"), 297, 841)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+3/2"), 297, 1051)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+2"), 297, 1261)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+5/2"), 297, 1471)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+3"), 297, 1682)); pages.push_back(DRAWFRAME::STPage(_T("A3"), _T("A3+7/2"), 297, 1892)); g_pagegrp.insert(DRAWFRAME::STPageGrp(4, _T("A3"), 297, pages)); pages.clear(); pages.push_back(DRAWFRAME::STPage(_T("A4"), _T("A4"), 210, 297)); pages.push_back(DRAWFRAME::STPage(_T("A4"), _T("A4+1/2"), 210, 445)); pages.push_back(DRAWFRAME::STPage(_T("A4"), _T("A4+1"), 210, 594)); g_pagegrp.insert(DRAWFRAME::STPageGrp(5, _T("A4"), 210, pages)); pages.clear(); } static int g_init = init_func(); void DRAWFRAME::InitPageGrp() { CString xmlpath = utility::getConfigFilePath(_T("ttitleframe.xml")); do { CXMLDOMFile file; if (!file.Open(xmlpath)) break; CXMLDOMNodesPtr grpLst = file.GetNodesByTagName(NODE_GROUP); if (!grpLst.isvalid()) break; CXMLDOMNodesPtr pageLst; CXMLDOMNodePtr grpPtr, pagePtr; CString grpName(_T("")); TCHAR pbuf[256]; int grpidx(-1), grpwidth(-1); DRAWFRAME::PAGES pages(0); DRAWFRAME::STPage page; DRAWFRAME::STPageGrp pagegrp; for (int i = 0; i < grpLst->GetCount(); ++i) { grpPtr = grpLst->GetItem(i); if (!grpPtr.isvalid()) continue; grpName = grpPtr->GetAttributeValue(ATTR_NAME); grpidx = _ttoi(grpPtr->GetAttributeValue(ATTR_IDX)); grpwidth = _ttoi(grpPtr->GetAttributeValue(ATTR_WIDTH)); pageLst = grpPtr->GetChildrenNodes(NODE_PAGE); if (!pageLst.isvalid()) continue; for (int j = 0; j < pageLst->GetCount(); ++j) { pagePtr = pageLst->GetItem(j); if (!pagePtr.isvalid()) continue; page._grpname = grpName; page._pagename = pagePtr->GetAttributeValue(ATTR_NAME); if (pagePtr->IsAttributeExist(ATTR_WIDTH)) page._width = _ttoi(pagePtr->GetAttributeValue(ATTR_WIDTH)); else page._width = grpwidth; page._length = _ttoi(pagePtr->GetAttributeValue(ATTR_LENGTH)); pages.push_back(page); } g_pagegrp.insert(DRAWFRAME::STPageGrp(grpidx, grpName, grpwidth, pages)); pages.clear(); } return; } while (false); default_init_func(); }