home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************/
- /* */
- /* TurboCAD for Windows */
- /* Copyright (c) 1993 - 2001 */
- /* International Microcomputer Software, Inc. */
- /* (IMSI) */
- /* All rights reserved. */
- /* */
- /******************************************************************/
-
- // Merge.cpp: implementation of the CMerge class.
- //
- // CMerge class performs insertion one drawing
- // in another (with merge line styles, brush styles etc.)
- //////////////////////////////////////////////////////////////////////
-
- #include "stdafx.h"
- #include "InsTool.h"
- #include "InsSymb.h"
- #include "TDialog.h"
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
-
- template <class IStyles, class IStyle> HRESULT StylesMerge(IStyles *pISrc, IStyles *pITrg, CMerge* pMerge)
- {
- HRESULT hr = E_FAIL;
- BSTR bstrName = NULL;
- COleVariant varItem;
- long lCnt = 0;
- long lItem = 0;
- IStyle* pIStyle = NULL;
-
- try
- {
- hr = pISrc->get_Count(&lCnt);
- CHECK_HRESULT(hr);
-
- for (lItem = 0; lItem < lCnt; lItem++)
- {
- varItem = lItem;
- hr = pISrc->get_Item(&varItem, &pIStyle);
- CHECK_HRESULT(hr);
-
- hr = pMerge->StyleMerge(pIStyle);
- CHECK_HRESULT(hr);
-
- ::SysFreeString(bstrName);
- bstrName = NULL;
-
- pIStyle->Release();
- pIStyle = NULL;
- }
- hr = S_OK;
- }
- catch (...)
- {
- }
-
- _clearfp();
-
- if (bstrName != NULL)
- ::SysFreeString(bstrName);
-
- if (pIStyle != NULL)
- pIStyle->Release();
-
- return hr;
- }
-
-
- void CMapStyles::CleanAll()
- {
- long lInd = 0;
- Style *pStyle = NULL;
- POSITION pos = GetStartPosition();
- while (pos != NULL)
- {
- GetNextAssoc(pos, lInd, pStyle);
- if (pStyle != NULL)
- pStyle->Release();
- }
- RemoveAll();
- }
-
- void CMapLineStyles::CleanAll()
- {
- long lInd = 0;
- LineStyle *pLineStyle = NULL;
- POSITION pos = GetStartPosition();
- while (pos != NULL)
- {
- GetNextAssoc(pos, lInd, pLineStyle);
- if (pLineStyle != NULL)
- pLineStyle->Release();
- }
- RemoveAll();
- }
-
- void CMapBrushStyles::CleanAll()
- {
- long lInd = 0;
- BrushStyle *pBrushStyle = NULL;
- POSITION pos = GetStartPosition();
- while (pos != NULL)
- {
- GetNextAssoc(pos, lInd, pBrushStyle);
- if (pBrushStyle != NULL)
- pBrushStyle->Release();
- }
- RemoveAll();
- }
-
- void CMapBlocks::CleanAll()
- {
- long lInd = 0;
- Block *pBlock = NULL;
- POSITION pos = GetStartPosition();
- while (pos != NULL)
- {
- GetNextAssoc(pos, lInd, pBlock);
- if (pBlock != NULL)
- pBlock->Release();
- }
- RemoveAll();
- }
-
- void CMapLayers::CleanAll()
- {
- long lInd = 0;
- Layer *pLayer = NULL;
- POSITION pos = GetStartPosition();
- while (pos != NULL)
- {
- GetNextAssoc(pos, lInd, pLayer);
- if (pLayer != NULL)
- pLayer->Release();
- }
- RemoveAll();
- }
-
- void CArrBlock::CleanAll()
- {
- int lCount = GetSize();
- Block *pBlock = NULL;
- for (int iInd = 0; iInd < lCount; iInd++)
- {
- pBlock = GetAt(iInd);
- if (pBlock != NULL)
- pBlock->Release();
- }
- }
-
- void CArrLayer::CleanAll()
- {
- int lCount = GetSize();
- Layer *pLayer = NULL;
- for (int iInd = 0; iInd < lCount; iInd++)
- {
- pLayer = GetAt(iInd);
- if (pLayer != NULL)
- pLayer->Release();
- }
- }
-
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
-
- CMerge::CMerge() :
- m_bInit(FALSE),
- m_pIDwgSrc(NULL),
- m_pStylesSrc(NULL),
- m_pLineStylesSrc(NULL),
- m_pBrushStylesSrc(NULL),
- m_pBlksSrc(NULL),
- m_pGrsSrc(NULL),
- m_pSelSrc(NULL),
- m_pIDwgTrg(NULL),
- m_pStylesTrg(NULL),
- m_pLineStylesTrg(NULL),
- m_pBrushStylesTrg(NULL),
- m_pBlksTrg(NULL),
- m_pGrsTrg(NULL),
- m_pIGrMerge(NULL),
- m_pLayersSrc(NULL),
- m_pLayersTrg(NULL)
- {
- }
-
- CMerge::~CMerge()
- {
- CleanAll();
- }
-
- void CMerge::CleanAll()
- {
-
- RELEASE(m_pStylesSrc)
- RELEASE(m_pLineStylesSrc)
- RELEASE(m_pBrushStylesSrc)
- RELEASE(m_pBlksSrc)
- RELEASE(m_pGrsSrc)
- RELEASE(m_pSelSrc)
- RELEASE(m_pLayersSrc)
-
- RELEASE(m_pIDwgSrc)
-
- RELEASE(m_pStylesTrg)
- RELEASE(m_pLineStylesTrg)
- RELEASE(m_pBrushStylesTrg)
- RELEASE(m_pBlksTrg)
- RELEASE(m_pGrsTrg)
- RELEASE(m_pLayersTrg)
-
- RELEASE(m_pIDwgTrg)
-
- RELEASE(m_pIGrMerge)
-
- m_bInit = FALSE;
-
- }
-
- HRESULT CMerge::Init(IDrawing *pIDwgSrc, IDrawing *pIDwgTrg, BOOL bSel)
- {
- HRESULT hRes = E_FAIL;
- COleVariant varType((const long)imsiGroup);
- if (pIDwgSrc == NULL
- || pIDwgTrg == NULL)
- return hRes;
-
- if (m_bInit)
- CleanAll();
- HMODULE hDBAPI = NULL;
- hDBAPI = GetModuleHandle(DBAPI80);
- if (hDBAPI == NULL)
- {
- hDBAPI = GetModuleHandle(DBAPI70);
-
- if (hDBAPI == NULL)
- {
- hDBAPI = GetModuleHandle(DBAPI60);
- }
- }
-
- m_pfnDwgGetGraphic = (DRAWINGGETGRAPHIC)GetProcAddress(hDBAPI, _T("DrawingGetPaperRoot"));
- if (m_pfnDwgGetGraphic == NULL)
- return hRes;
-
- m_pfnGrGetDispatch = (GRAPHICGETDISPATCH)GetProcAddress(hDBAPI, _T("GraphicGetDispatch"));
- if (m_pfnGrGetDispatch == NULL)
- return hRes;
-
- try
- {
- m_pIDwgSrc = pIDwgSrc;
- m_pIDwgSrc->AddRef();
-
- hRes = m_pIDwgSrc->get_Styles(&m_pStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_LineStyles(&m_pLineStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_BrushStyles(&m_pBrushStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_Blocks(&m_pBlksSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_Layers(&m_pLayersSrc);
- CHECK_HRESULT(hRes)
-
- m_bSel = bSel;
- if (m_bSel)
- hRes = m_pIDwgSrc->get_Selection(&m_pSelSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_Graphics(&m_pGrsSrc);
- CHECK_HRESULT(hRes)
-
- m_pIDwgTrg = pIDwgTrg;
- m_pIDwgTrg->AddRef();
-
- hRes = m_pIDwgTrg->get_Styles(&m_pStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_LineStyles(&m_pLineStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_BrushStyles(&m_pBrushStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_Blocks(&m_pBlksTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_Layers(&m_pLayersTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_Graphics(&m_pGrsTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pGrsTrg->Add(&varType,
- &varMissing,
- &varMissing,
- &varMissing,
- &varMissing,
- &varMissing,
- &m_pIGrMerge);
- CHECK_HRESULT(hRes)
-
- m_pGrsTrg->Release();
- m_pGrsTrg = NULL;
-
- hRes = m_pIGrMerge->get_Graphics(&m_pGrsTrg);
- CHECK_HRESULT(hRes)
-
- m_bInit = TRUE;
- hRes = S_OK;
- }
- catch (...)
- {
- CleanAll();
- _clearfp();
- }
-
- return hRes;
- }
-
-
- HRESULT CMerge::InitA(IDrawing *pIDwgSrc, IDrawing *pIDwgTrg)
- {
- HRESULT hRes = E_FAIL;
- if (pIDwgSrc == NULL
- || pIDwgTrg == NULL)
- return hRes;
-
- HMODULE hDBAPI = NULL;//GetModuleHandle(DBAPI);
- hDBAPI = GetModuleHandle(DBAPI80);
- if (hDBAPI == NULL)
- {
- hDBAPI = GetModuleHandle(DBAPI70);
- if (hDBAPI == NULL)
- {
- hDBAPI = GetModuleHandle(DBAPI60);
- }
- }
-
- m_pfnDwgGetGraphic = (DRAWINGGETGRAPHIC)GetProcAddress(hDBAPI, _T("DrawingGetPaperRoot"));
- if (m_pfnDwgGetGraphic == NULL)
- return hRes;
-
- m_pfnGrGetDispatch = (GRAPHICGETDISPATCH)GetProcAddress(hDBAPI, _T("GraphicGetDispatch"));
- if (m_pfnGrGetDispatch == NULL)
- return hRes;
-
- try
- {
- m_pIDwgSrc = pIDwgSrc;
- m_pIDwgSrc->AddRef();
-
- hRes = m_pIDwgSrc->get_Styles(&m_pStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_LineStyles(&m_pLineStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_BrushStyles(&m_pBrushStylesSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_Blocks(&m_pBlksSrc);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgSrc->get_Layers(&m_pLayersSrc);
- CHECK_HRESULT(hRes)
-
-
- m_pIDwgTrg = pIDwgTrg;
- m_pIDwgTrg->AddRef();
-
- hRes = m_pIDwgTrg->get_Styles(&m_pStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_LineStyles(&m_pLineStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_BrushStyles(&m_pBrushStylesTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_Blocks(&m_pBlksTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pIDwgTrg->get_Layers(&m_pLayersTrg);
- CHECK_HRESULT(hRes)
-
- m_bInit = TRUE;
- hRes = S_OK;
- }
- catch (...)
- {
- CleanAll();
- _clearfp();
- }
-
- return hRes;
- }
-
-
- HRESULT CMerge::Run(IGraphic **ppIGrMerge, BOOL bGrsOnly)
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- *ppIGrMerge = NULL;
-
- Graphics *pGrsSrc = NULL;
- Graphics *pGrsTrg = NULL;
-
- try
- {
- if (!bGrsOnly)
- {
- hRes = MergeStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeLineStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeBrushStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeLayers();
- CHECK_HRESULT(hRes)
-
- hRes = MergeBlocks();
- CHECK_HRESULT(hRes)
- }
- if (!m_bSel)
- hRes = MergeGraphics(m_pGrsSrc, m_pGrsTrg);
- else
- hRes = MergeSelGraphics();
- CHECK_HRESULT(hRes)
-
- hRes = CorrectGraphic(m_pIGrMerge);
- CHECK_HRESULT(hRes)
-
- }
- catch (...)
- {
- m_pIGrMerge->Delete();
- m_pIGrMerge = NULL;
-
- CleanAddedBlocks();
- CleanAddedLayers();
- _clearfp();
- }
-
- if (ppIGrMerge != NULL
- && m_pIGrMerge != NULL)
- {
- *ppIGrMerge = m_pIGrMerge;
- (*ppIGrMerge)->AddRef();
- }
- return hRes;
- }
-
- HRESULT CMerge::RunA() // merge only styles, blocks, layers (not gaphics).
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- try
- {
- hRes = MergeStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeLineStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeBrushStyles();
- CHECK_HRESULT(hRes)
-
- hRes = MergeLayers();
- CHECK_HRESULT(hRes)
-
- hRes = MergeBlocks();
- CHECK_HRESULT(hRes)
- }
- catch (...)
- {
- CleanAddedBlocks();
- CleanAddedLayers();
- _clearfp();
- }
-
- return hRes;
- }
-
- HRESULT CMerge::StyleMerge(IUnknown *pIUnkStyle)
- {
- HRESULT hRes = E_FAIL;
- Style *pStyle = NULL;
- LineStyle *pLineStyle = NULL;
- BrushStyle *pBrushStyle = NULL;
-
- try
- {
- hRes = pIUnkStyle->QueryInterface(IID_Style, (void**)&pStyle);
- if (SUCCEEDED(hRes))
- {
- hRes = MergeStyle(pStyle);
- CHECK_HRESULT(hRes)
- }
-
- if (FAILED(hRes))
- {
- hRes = pIUnkStyle->QueryInterface(IID_LineStyle, (void**)&pLineStyle);
- if (SUCCEEDED(hRes))
- {
- hRes = MergeLineStyle(pLineStyle);
- CHECK_HRESULT(hRes)
- }
- }
-
- if (FAILED(hRes))
- {
- hRes = pIUnkStyle->QueryInterface(IID_BrushStyle, (void**)&pBrushStyle);
- if (SUCCEEDED(hRes))
- {
- hRes = MergeBrushStyle(pBrushStyle);
- CHECK_HRESULT(hRes)
- }
- }
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pStyle != NULL)
- pStyle->Release();
-
- if (pLineStyle != NULL)
- pLineStyle->Release();
-
- if (pBrushStyle != NULL)
- pBrushStyle->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::MergeStyle(Style *pStSrc)
- {
- HRESULT hRes = E_FAIL;
-
- BSTR bstrName = NULL;
- CComVariant varItem;
- Style *pStTrg = NULL;
-
- try
- {
- hRes = pStSrc->get_Name(&bstrName);
- CHECK_HRESULT(hRes);
-
- varItem = bstrName;
- hRes = m_pStylesTrg->get_Item(&varItem, &pStTrg);
-
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pStTrg != NULL)
- pStTrg->Release();
- return hRes;
- }
-
- HRESULT CMerge::MergeStyles()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- try
- {
- hRes = StylesMerge<Styles, Style>(m_pStylesSrc, m_pStylesTrg, this);
- }
- catch (...)
- {
- _clearfp();
- }
-
- return hRes;
- }
-
- HRESULT CMerge::MergeLineStyle(LineStyle *pLineStSrc)
- {
- HRESULT hRes = E_FAIL;
-
- CComVariant varItem;
- CComVariant varDashes;
- CComVariant varDescription;
-
- BSTR bstrName = NULL;
- CString cstrDescription(_T("Added brushstyle"));//# Non-localizable string#
- BSTR bstrDescription = cstrDescription.AllocSysString();
-
- LineStyle *pLineStTrg = NULL;
- long lIndex = 0;
-
- try
- {
- hRes = pLineStSrc->get_Name(&bstrName);
- CHECK_HRESULT(hRes);
-
- varItem = bstrName;
- hRes = m_pLineStylesTrg->get_Item(&varItem, &pLineStTrg);
-
- if (FAILED(hRes))
- {
- hRes = pLineStSrc->GetDashes(&varDashes);
- CHECK_HRESULT(hRes);
-
- varDescription = bstrDescription;
-
- hRes = m_pLineStylesTrg->Add(bstrName, &varDashes, &varDescription, &pLineStTrg);
- CHECK_HRESULT(hRes);
- }
-
- hRes = pLineStSrc->get_Index(&lIndex);
- CHECK_HRESULT(hRes);
-
- m_mapLineStyles.SetAt(lIndex, pLineStTrg);
- pLineStTrg->AddRef();
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pLineStTrg != NULL)
- pLineStTrg->Release();
-
- if (bstrDescription != NULL)
- ::SysFreeString(bstrDescription);
- return hRes;
- }
-
- HRESULT CMerge::MergeLineStyles()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- try
- {
- hRes = StylesMerge<LineStyles, LineStyle>(m_pLineStylesSrc, m_pLineStylesTrg, this);
- hRes = S_OK;
- }
- catch (...)
- {
- _clearfp();
- }
-
- return hRes;
- }
-
- HRESULT CMerge::MergeBrushStyles()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- try
- {
- hRes = StylesMerge<BrushStyles, BrushStyle>(m_pBrushStylesSrc, m_pBrushStylesTrg, this);
- }
- catch (...)
- {
- _clearfp();
- }
-
- return hRes;
- }
-
- HRESULT CMerge::MergeBrushStyle(BrushStyle *pBrStSrc)
- {
- HRESULT hRes = E_FAIL;
-
- BSTR bstrName = NULL;
- CComVariant varItem;
- BrushStyle *pBrStTrg = NULL;
- long lIndex = 0;
- try
- {
- hRes = pBrStSrc->get_Name(&bstrName);
- CHECK_HRESULT(hRes);
-
- varItem = bstrName;
- hRes = m_pBrushStylesTrg->get_Item(&varItem, &pBrStTrg);
- if (SUCCEEDED(hRes))
- {
- hRes = pBrStSrc->get_Index(&lIndex);
- m_mapBrushStyles.SetAt(lIndex, pBrStTrg);
- pBrStTrg->AddRef();
- }
- hRes = S_OK;
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pBrStTrg != NULL)
- pBrStTrg->Release();
- return hRes;
- }
-
- HRESULT CMerge::MergeLayer(Layer *pLyrSrc, Layer** ppLyrTrg)
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- BSTR bstrName = NULL;
- COleVariant varName;
-
- long lIndex = 0;
- COleVariant varIndex;
-
- COleVariant varVisible(varMissing);
- COleVariant varEditable(varMissing);
- COleVariant varFrozen(varMissing);
- COleVariant varColor(varMissing);
- COleVariant varZOrder(varMissing);
-
- IMSI_COLOR color = 0;
- IMSI_BOOL bEditable = TRUE;
- IMSI_BOOL bFrozen = FALSE;
- IMSI_BOOL bVisible = TRUE;
- long lZOrder = 0;
-
- COleVariant varLineStyle(varMissing);
- COleVariant varBrushStyle(varMissing);
- COleVariant varStyle(varMissing);
-
- BrushStyle* pBrushStyle = NULL;
- LineStyle* pLineStyle = NULL;
- Style* pStyle = NULL;
-
- try
- {
- hRes = pLyrSrc->get_Name(&bstrName);
- CHECK_HRESULT(hRes)
-
- varName = bstrName;
- hRes = m_pLayersTrg->get_Item(&varName, ppLyrTrg);
- if (FAILED(hRes))
- {
- hRes = pLyrSrc->get_LineStyle(&pLineStyle);
- CHECK_HRESULT(hRes)
-
- hRes = pLineStyle->get_Index(&lIndex);
- pLineStyle->Release();
- pLineStyle = NULL;
- if (m_mapLineStyles.Lookup(lIndex, pLineStyle))
- {
- varLineStyle.vt = VT_DISPATCH;
- varLineStyle.pdispVal = (IDispatch *)pLineStyle;
- pLineStyle->AddRef();
- }
-
- hRes = pLyrSrc->get_Color(&color);
- CHECK_HRESULT(hRes)
- varColor = color;
-
- hRes = pLyrSrc->get_Editable(&bEditable);
- CHECK_HRESULT(hRes)
- varEditable.vt = VT_BOOL;
- varEditable.bVal = bEditable;
-
- hRes = pLyrSrc->get_Frozen(&bFrozen);
- CHECK_HRESULT(hRes)
- varFrozen.vt = VT_BOOL;
- varFrozen.bVal = bFrozen;
-
- hRes = pLyrSrc->get_Visible(&bVisible);
- CHECK_HRESULT(hRes)
- varVisible.vt = VT_BOOL;
- varVisible.bVal = bVisible;
-
- hRes = pLyrSrc->get_ZOrder(&lZOrder);
- CHECK_HRESULT(hRes)
- varZOrder = lZOrder;
-
- hRes = m_pLayersTrg->Add(bstrName,
- &varVisible,
- &varEditable,
- &varFrozen,
- &varColor,
- &varLineStyle,
- &varBrushStyle,
- &varStyle,
- &varZOrder,
- ppLyrTrg);
- CHECK_HRESULT(hRes)
-
- m_arrLyrs.Add((*ppLyrTrg));
- (*ppLyrTrg)->AddRef();
- }
-
- hRes = S_OK;
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (bstrName != NULL)
- ::SysFreeString(bstrName);
-
- if (pBrushStyle != NULL)
- pBrushStyle->Release();
-
- if (pStyle != NULL)
- pStyle->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::MergeLayers()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- Layer *pLyrSrc = NULL;
- Layer *pLyrTrg = NULL;
-
- try
- {
- long lCount = 0;
- hRes = m_pLayersSrc->get_Count(&lCount);
- CHECK_HRESULT(hRes)
-
- long lItem = 0;
- COleVariant varItem(lItem);
- for (lItem = 0; lItem < lCount; lItem++)
- {
- varItem = lItem;
- hRes = m_pLayersSrc->get_Item(&varItem, &pLyrSrc);
- CHECK_HRESULT(hRes)
-
- hRes = MergeLayer(pLyrSrc, &pLyrTrg);
- CHECK_HRESULT(hRes)
-
- m_mapLayers.SetAt(lItem, pLyrTrg);
- pLyrTrg = NULL;
-
- pLyrSrc->Release();
- pLyrSrc = NULL;
- }
-
- hRes = S_OK;
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pLyrSrc != NULL)
- pLyrSrc->Release();
-
- if (pLyrTrg != NULL)
- pLyrTrg->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::MergeBlock(Block *pBlkSrc, Block** ppBlkTrg)
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- BSTR bstrName = NULL;
- COleVariant varName;
-
- IVertex *pIVrt = NULL;
-
- IDispatch *pIDisp = NULL;
- Graphics *pGrsSrc = NULL;
- IGraphic *pIGrSrc = NULL;
-
- COleVariant varX(0L);
- COleVariant varY(0L);
- COleVariant varZ(0L);
-
- long lIndex = 0;
- COleVariant varIndex;
-
- IGraphic *pIGrTrg = NULL;
-
- try
- {
- hRes = pBlkSrc->get_Name(&bstrName);
- CHECK_HRESULT(hRes)
-
- varName = bstrName;
- hRes = m_pBlksTrg->get_Item(&varName, ppBlkTrg);
- if (FAILED(hRes))
- {
- hRes = pBlkSrc->get_Anchor(&pIVrt);
- if (SUCCEEDED(hRes))
- {
- double x = 0;
- hRes = pIVrt->get_X(&x);
- CHECK_HRESULT(hRes)
- varX = x;
-
- double y = 0;
- hRes = pIVrt->get_Y(&y);
- CHECK_HRESULT(hRes)
- varY = y;
-
- double z = 0;
- hRes = pIVrt->get_Z(&z);
- CHECK_HRESULT(hRes)
- varZ = z;
- }
-
- hRes = pBlkSrc->get_Graphics(&pGrsSrc);
- CHECK_HRESULT(hRes)
-
- hRes = pGrsSrc->get_Parent(&pIDisp);
- CHECK_HRESULT(hRes)
-
- hRes = pIDisp->QueryInterface(IID_IGraphic, (void**)&pIGrSrc);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrSrc->Duplicate(&pIGrTrg);
- CHECK_HRESULT(hRes)
-
- hRes = m_pGrsTrg->AddGraphic(pIGrTrg, &varMissing, &varMissing);
- CHECK_HRESULT(hRes)
-
- hRes = CorrectGraphic(pIGrTrg, FALSE);
- CHECK_HRESULT(hRes)
-
- hRes = m_pBlksTrg->Add(bstrName,
- pIGrTrg,
- &varX,
- &varY,
- &varZ,
- &varFalse,
- &varFalse,
- NULL,
- ppBlkTrg);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->Delete();
- CHECK_HRESULT(hRes)
-
- m_arrBlks.Add((*ppBlkTrg));
- (*ppBlkTrg)->AddRef();
- }
-
- hRes = S_OK;
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (bstrName != NULL)
- ::SysFreeString(bstrName);
-
- if (pIVrt != NULL)
- pIVrt->Release();
-
- if (pGrsSrc != NULL)
- pGrsSrc->Release();
-
- if (pIGrSrc != NULL)
- pIGrSrc->Release();
-
- if (pIDisp != NULL)
- pIDisp->Release();
-
- if (pIGrTrg != NULL)
- pIGrTrg->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::MergeBlocks()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- Properties *pProps = NULL;
- Property *pProp = NULL;
-
- CString cstrProp(_T("TileMode"));//# Non-localizable string#
- COleVariant varProp(cstrProp);
- COleVariant varValOld;
-
- COleVariant varValMS;
- varValMS.vt = VT_I2;
- varValMS.iVal = 1;
- COleVariant varValPS;
- varValPS.vt = VT_I2;
- varValPS.iVal = 0;
- IDispatch *pIGrRoot = NULL;
-
- Block *pBlkSrc = NULL;
- Block *pBlkTrg = NULL;
-
-
- Graphics *pGrs = NULL;
- pGrs = m_pGrsTrg;
-
- try
- {
- hRes = m_pIDwgTrg->get_Properties(&pProps);
- CHECK_HRESULT(hRes)
-
- hRes = pProps->get_Item(&varProp, &pProp);
- CHECK_HRESULT(hRes)
-
- hRes = pProp->get_Value(0, &varValOld);
- CHECK_HRESULT(hRes)
-
- if (varValOld == varValPS)
- {
- long lDwg = 0;
- hRes = m_pIDwgTrg->get__Handle(&lDwg);
- CHECK_HRESULT(hRes)
-
- long lRoot = (*m_pfnDwgGetGraphic)(lDwg);
- if (lRoot == 0)
- throw E_FAIL;
-
- pIGrRoot = (*m_pfnGrGetDispatch)(lRoot, NULL);
- if (pIGrRoot == 0)
- throw E_FAIL;
-
- hRes = pProp->put_Value(0, &varValMS);
- CHECK_HRESULT(hRes)
- }
-
- hRes = m_pIDwgTrg->get_Graphics(&m_pGrsTrg);
- CHECK_HRESULT(hRes)
-
- long lCount = 0;
- hRes = m_pBlksSrc->get_Count(&lCount);
- CHECK_HRESULT(hRes)
-
- long lItem = 0;
- COleVariant varItem(lItem);
- for (lItem = 0; lItem < lCount; lItem++)
- {
- varItem = lItem;
- hRes = m_pBlksSrc->get_Item(&varItem, &pBlkSrc);
- CHECK_HRESULT(hRes)
-
- hRes = MergeBlock(pBlkSrc, &pBlkTrg);
- CHECK_HRESULT(hRes)
-
- m_mapBlks.SetAt(lItem, pBlkTrg);
- pBlkTrg = NULL;
-
- pBlkSrc->Release();
- pBlkSrc = NULL;
- }
-
- hRes = CorrectAddedBlocks();
- CHECK_HRESULT(hRes);
-
- if (varValOld == varValPS)
- {
- hRes = pProp->put_Value(0, &varValOld);
- CHECK_HRESULT(hRes);
-
- m_pGrsTrg->Release();
- m_pGrsTrg = NULL;
-
- hRes = m_pIDwgTrg->get_Graphics(&m_pGrsTrg); // it is need to call DrawingUpdateCurrentRoot
- CHECK_HRESULT(hRes);
- }
-
- hRes = S_OK;
- }
- catch (...)
- {
- TRACE_EXCEPTION("CMerge::MergeBlocks")
- _clearfp();
-
- }
-
- if (pIGrRoot != NULL)
- pIGrRoot->Release();
-
- if (m_pGrsTrg != NULL)
- m_pGrsTrg->Release();
-
- m_pGrsTrg = pGrs;
-
- if (pProp != NULL)
- pProp->Release();
-
- if (pProps != NULL)
- pProps->Release();
-
- if (pBlkSrc != NULL)
- pBlkSrc->Release();
-
- if (pBlkTrg != NULL)
- pBlkTrg->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::MergeSelGraphics()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- IGraphic *pIGrSrc = NULL;
- IGraphic *pIGrTrg = NULL;
-
- long lCount = 0;
- long lItem = 0;
- COleVariant varItem(lItem);
-
- long lInd = 0;
- COleVariant varInd(lInd);
-
- try
- {
- hRes = m_pSelSrc->get_Count(&lCount);
- CHECK_HRESULT(hRes)
-
- for (lItem = 0; lItem < lCount; lItem++)
- {
- varItem = lItem;
- hRes = m_pSelSrc->get_Item(&varItem, &pIGrSrc);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrSrc->Duplicate(&pIGrTrg);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->get_Index(&lInd);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->Release();
- CHECK_HRESULT(hRes)
-
- pIGrTrg = NULL;
-
- varInd = lInd;
- hRes = m_pGrsSrc->Remove(&varInd, &pIGrTrg);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->put_ID(0);
- CHECK_HRESULT(hRes)
-
- hRes = m_pGrsTrg->AddGraphic(pIGrTrg, &varMissing, &varMissing);
-
- pIGrTrg->Release();
- pIGrTrg = NULL;
- }
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pIGrSrc != NULL)
- pIGrSrc->Release();
-
- if (pIGrTrg != NULL)
- pIGrTrg->Release();
- return hRes;
- }
-
- HRESULT CMerge::MergeGraphics(Graphics *pGrsSrc, Graphics *pGrsTrg)
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- IGraphic *pIGrSrc = NULL;
- IGraphic *pIGrTrg = NULL;
-
- long lCount = 0;
- long lItem = 0;
- COleVariant varItem(lItem);
-
- long lInd = 0;
- COleVariant varInd(lInd);
-
- try
- {
- hRes = m_pGrsSrc->get_Count(&lCount);
- CHECK_HRESULT(hRes)
-
- for (lItem = 0; lItem < lCount; lItem++)
- {
- varItem = lItem;
- hRes = m_pGrsSrc->get_Item(&varItem, &pIGrSrc);
- CHECK_HRESULT(hRes)
- ImsiGraphicType GrType;
- hRes = pIGrSrc->get_TypeByValue(&GrType);
- CHECK_HRESULT(hRes)
-
- BSTR bstrGrType;
- hRes = pIGrSrc->get_Type(&bstrGrType);
- CHECK_HRESULT(hRes)
- CString cstrGrType;
- cstrGrType = bstrGrType;
- ::SysFreeString(bstrGrType);
- bstrGrType = NULL;
-
- if( cstrGrType != "TCLight")//# Non-localizable string#
- {
- if (GrType != imsiViewport && GrType != imsiOleObject) // ViewPorts and OLE objects are excluded from merge
- {
- hRes = pIGrSrc->Duplicate(&pIGrTrg);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->get_Index(&lInd);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->Release();
- CHECK_HRESULT(hRes)
-
- pIGrTrg = NULL;
-
- varInd = lInd;
- hRes = m_pGrsSrc->Remove(&varInd, &pIGrTrg);
- CHECK_HRESULT(hRes)
-
- hRes = pIGrTrg->put_ID(0);
- CHECK_HRESULT(hRes)
-
- hRes = m_pGrsTrg->AddGraphic(pIGrTrg, &varMissing, &varMissing);
-
- pIGrTrg->Release();
- pIGrTrg = NULL;
- }
- }
- pIGrSrc->Release();
- pIGrSrc = NULL;
-
- }
- }
- catch (...)
- {
- _clearfp();
- }
-
- if (pIGrSrc != NULL)
- pIGrSrc->Release();
-
- if (pIGrTrg != NULL)
- pIGrTrg->Release();
-
- return hRes;
- }
-
- HRESULT CMerge::CorrectAddedBlocks()
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- hRes = S_OK;
- int iCount = m_arrBlks.GetSize();
- int iInd = 0;
- Block *pBlk = NULL;
-
- Graphics *pGrs = NULL;
- IDispatch *pIDisp = NULL;
- IGraphic *pIGr = NULL;
-
-
- for (iInd = 0; iInd < iCount; iInd++)
- {
- pBlk = m_arrBlks[iInd];
- if (pBlk != NULL)
- {
- try
- {
- hRes = pBlk->get_Graphics(&pGrs);
- CHECK_HRESULT(hRes)
-
- hRes = pGrs->get_Parent(&pIDisp);
- CHECK_HRESULT(hRes)
-
- hRes = pIDisp->QueryInterface(IID_IGraphic, (void **)&pIGr);
- CHECK_HRESULT(hRes)
-
- hRes = CorrectGraphic(pIGr);
- CHECK_HRESULT(hRes)
- }
- catch (...)
- {
- pBlk->Delete();
- pBlk->Release();
- m_arrBlks[iInd] = NULL;
- }
-
- if (pIDisp != NULL)
- pIDisp->Release();
-
- if (pGrs != NULL)
- pGrs->Release();
-
- if (pIGr != NULL)
- pIGr->Release();
- }
- }
- return hRes;
- }
-
- void CMerge::CleanAddedBlocks()
- {
- if (!m_bInit)
- return ;
-
- try
- {
-
- }
- catch (...)
- {
- _clearfp();
- }
- }
-
- void CMerge::CleanAddedLayers()
- {
- if (!m_bInit)
- return ;
-
- try
- {
-
- }
- catch (...)
- {
- _clearfp();
- }
- }
-
- HRESULT CMerge::CorrectGraphic(IGraphic * pIGr, BOOL bCorrectInserts)
- {
- HRESULT hRes = E_FAIL;
- if (!m_bInit)
- return hRes;
-
- CString cstrType;
- BSTR bstrType = NULL;
-
- Block *pBlkSrc = NULL;
- Block *pBlkTrg = NULL;
-
- Layer *pLyr = NULL;
- long lIndex = 0;
-
- CString cstrDefLayer("0");
- BSTR bstrDefLayer = cstrDefLayer.AllocSysString();
-
- CString cstrDefLineSt("CONTINUOUS");//# Non-localizable string#
- BSTR bstrDefLineSt = cstrDefLineSt.AllocSysString();
-
- CString cstrDefBrushSt("SOLID");//# Non-localizable string#
- BSTR bstrDefBrushSt = cstrDefBrushSt.AllocSysString();
-
- COleVariant varLayer;
- COleVariant varLineSt;
- COleVariant varBrushSt;
-
- Graphics *pGrs = NULL;
- IGraphic *pIGrC = NULL;
-
- LineStyle *pLineSt = NULL;
- BrushStyle *pBrushSt = NULL;
-
- try
- {
- // TODO : to correct Styles, LineStyles, BrushStyles
- hRes = pIGr->get_Layer(&pLyr);
- if (SUCCEEDED(hRes))
- {
- hRes = pLyr->get_Index(&lIndex);
- CHECK_HRESULT(hRes)
-
- pLyr->Release();
- pLyr = NULL;
-
- if (m_mapLayers.Lookup(lIndex, pLyr))
- {
- varLayer.vt = VT_DISPATCH;
- varLayer.pdispVal = (IDispatch *)pLyr;
- pLyr->AddRef();
- }
- else
- varLayer = bstrDefLayer;
-
- hRes = pIGr->put_Layer(varLayer);
- }
-
- hRes = pIGr->get_LineStyle(&pLineSt);
- if (SUCCEEDED(hRes))
- {
- long lID = 0;
- hRes = pLineSt->get__TableEntryID(&lID);
- if (((short)lID) > 0)
- {
- hRes = pLineSt->get_Index(&lIndex);
- CHECK_HRESULT(hRes)
-
- pLineSt->Release();
- pLyr = NULL;
-
- if (m_mapLineStyles.Lookup(lIndex, pLineSt))
- {
- varLineSt.vt = VT_DISPATCH;
- varLineSt.pdispVal = (IDispatch *)pLineSt;
- pLineSt->AddRef();
- }
- else
- varLineSt = bstrDefLineSt;
-
- hRes = pIGr->put_LineStyle(varLineSt);
- }
- }
-
- hRes = pIGr->get_BrushStyle(&pBrushSt);
- if (SUCCEEDED(hRes))
- {
- long lID = 0;
- hRes = pBrushSt->get__TableEntryID(&lID);
- if (((short)lID) > 0)
- {
- hRes = pBrushSt->get_Index(&lIndex);
- if (SUCCEEDED(hRes))
- {
- pBrushSt->Release();
- pLyr = NULL;
-
- if (m_mapBrushStyles.Lookup(lIndex, pBrushSt))
- {
- varLineSt.vt = VT_DISPATCH;
- varLineSt.pdispVal = (IDispatch *)pBrushSt;
- pBrushSt->AddRef();
- }
- else
- varBrushSt = bstrDefBrushSt;
- }
- else
- varBrushSt = bstrDefBrushSt;
-
- hRes = pIGr->put_BrushStyle(varBrushSt);
- }
- }
-
- hRes = pIGr->get_Type(&bstrType);
- CHECK_HRESULT(hRes)
-
- cstrType = bstrType;
- if (cstrType.CompareNoCase("Insert") == 0)//# Non-localizable string#
- {
- if (bCorrectInserts)
- {
- hRes = pIGr->get_Block(&pBlkSrc);
- CHECK_HRESULT(hRes)
-
- long lIndex = 0;
- hRes = pBlkSrc->get_Index(&lIndex);
- CHECK_HRESULT(hRes)
-
- if (m_mapBlks.Lookup(lIndex, pBlkTrg))
- {
- hRes = pIGr->put_Block(pBlkTrg);
- CHECK_HRESULT(hRes)
- }
- }
- }
- else
- {
-
- if (cstrType.CompareNoCase("Group") == 0)
- {
- hRes = pIGr->get_Graphics(&pGrs);
- CHECK_HRESULT(hRes)
-
- long lCount = 0;
- long lItem = 0;
- COleVariant varItem(lItem);
-
- hRes = pGrs->get_Count(&lCount);
- CHECK_HRESULT(hRes)
-
- for (lItem = 0; lItem < lCount; lItem++)
- {
- varItem = lItem;
- hRes = pGrs->get_Item(&varItem, &pIGrC);
- CHECK_HRESULT(hRes)
-
- short iCosm = 0;
- hRes = pIGrC->get_Cosmetic(&iCosm);
- if (!iCosm)
- {
- hRes = CorrectGraphic(pIGrC);
- CHECK_HRESULT(hRes)
- }
- pIGrC->Release();
- pIGrC = NULL;
- }
- }
- }
- }
- catch (...)
- {
- _clearfp();
- }
-
- varLayer.Clear();
-
- if (pBlkSrc != NULL)
- pBlkSrc->Release();
-
- if (pIGrC != NULL)
- pIGrC->Release();
-
- if (pGrs != NULL)
- pGrs->Release();
-
- return hRes;
- }
-
-