// neues DGeoObjekt in Liste aufnehmen: als Objekt zum akt. Block (Namen) hinzufügen // Symbole werden zerlegt Bool CBlockTree::AddObject (DGeoObj *&pObject) { try { // prüfe Parameter assert (pObject && m_pActBlockName && *m_pActBlockName); if (!pObject || !m_pActBlockName || !*m_pActBlockName) { yyerror (IDS_PARAM_ERROR); return True; // weiter parsen } // Block suchen CTable Tb (*this); if (!Tb.Find (m_pActBlockName)) { assert (False); // das sollte eigentlich nicht passieren return True; } // Objekt locken CBlockLock pBlock (Tb); if (!pBlock) { yyerror (IDS_SYSERROR); return False; } // Symbol wird an dieser Stelle zerlegt if (DGT_Symbol == pObject -> isA ()) return Output ((CSymbolObject *)pObject, pBlock->GetDGeoObjListe ()); else return pBlock->AddObject (pObject); } catch (bad_alloc) { yyerror (IDS_NOMEMORY); } return False; }
// Neuen Block in Baum anlegen Bool CBlockTree :: CreateBlock (char *pBlockName, double dXBasis, double dYBasis) { try { // akt. Block wird ungültig DELETE_VEC (m_pActBlockName); // prüfe Blocknamen if (!pBlockName || !*pBlockName) return True; // wurde der Block bereits gespeichert ? CTable Tb (*this); if (Tb.Find (pBlockName)) { assert (False); // das sollte eigentlich nicht passieren return True; } // Block speichern CBlockCreator BC (*this); CBlock *pBlock = ContCreate (BC, CBlock); Bool bRet = pBlock && pBlock -> Init (pBlockName, dXBasis, dYBasis); // akt. Blocknamen merken if (bRet) { m_pActBlockName = new char [strlen (pBlockName) + 1]; strcpy (m_pActBlockName, pBlockName); } return bRet; } catch (bad_alloc) { yyerror (IDS_NOMEMORY); } return False; }
// Block ausgeben Bool CBlockTree::Output (CSymbolObject *pSymbol, CDGeoObjListe *pGeoListe) // Objekte an akt { // prüfe Parameter assert (NULL != pSymbol); if (!pSymbol) { yyerror (IDS_SYSERROR); return False; } // prüfe Blocknamen char *pBlockName = (char *)pSymbol->GetBlockName(); if (!pBlockName || !*pBlockName) { assert (False); // sollte auch nicht passieren return True; // weiter parsen } // Block suchen und ausgeben CTable Tb (*this); if (!Tb.Find (pBlockName)) { assert (False); // sollte eigentlich nicht passieren return True; // weiter parsen } else { // Objekt gültig ? if (!Tb.Valid ()) { yyerror (IDS_SYSERROR); return False; } // Objekt locken CBlockLock pBlock (Tb); if (!pBlock) { yyerror (IDS_SYSERROR); return False; } // diesen Block entsprechend Zeilen und Spalten ausgeben // Parameter init. int iRows = pSymbol->Zeilen (); int iCols = pSymbol->Spalten (); // Parameter prüfen assert ((iRows >= 1) && (iCols >= 1) && pSymbol->GetMerkmalsListe ()); if ((iRows < 1) || (iCols < 1) || !pSymbol->GetMerkmalsListe ()) { yyerror (IDS_PARAM_ERROR); return True; // weiter parsen } // Blöcke ausgeben double dYOffset = 0; for (int i = 0; i < iRows; i++, dYOffset += pSymbol->ZeilenAbstand ()) { double dXOffset = 0; for (int j = 0; j < iCols; j++, dXOffset += pSymbol->SpaltenAbstand ()) { // Block ausgeben if (!pBlock -> Output (pSymbol->GetIdent (), pSymbol->GetMerkmalsListe (), pSymbol->XInsert (), pSymbol->YInsert (), pSymbol->XMasstab (), pSymbol->YMasstab (), pSymbol->GetWinkel (), dXOffset, dYOffset, pGeoListe)) return False; } } } return TRUE; }
// lese Merkmalskode aus dem Baum // wenn nicht vorhanden, einen neuen von Trias holen und diesen in der PBD // speichern //Bool MerkmalsBaum :: GetMerkmalsKode (char *pMName, ulong &MKode) Bool MerkmalsBaum :: GetMerkmalsKode (char *pMName, ulong &MKode, long lONr) // KK990927 { const short MaxLen = 20; // max. Namenslänge // gültiger Name ? if (!pMName) { yyerror (IDS_SYSERROR); return False; } // gültiger Wert ? char *pTempName = NULL; if (!*pMName) // evtl. Standard-Namen erzeugen { ResString strStandard (ResID (IDS_ST_MK_KT, &g_pTE -> RF ()), MaxLen); pTempName = new char [MaxLen + 1]; if (!pTempName) { yyerror (IDS_NOMEMORY); return False; } lstrcpy (pTempName, (char *) strStandard.Addr ()); pMName = pTempName; } // prüfen, ob Eintrag existiert ? Bool bRet = False; // noch nichts getan CTable Tb (*this); if (Tb.Find (pMName)) // Namen suchen { if (Tb.Valid ()) { MerkmalLock pM (Tb); if (pM) { MKode = pM -> MerkmalsKode (); bRet = True; } } } else {// neuen Eintrag erzeugen MKode = DEX_GetUniqueMCode (); // unique MK von Trias holen // KK990927 ulong lIdent = DEX_GetObjIdent(lONr); // if (CreateMerkmal (MKode, pMName, MaxMerkmalsLen) == EC_OKAY) if (CreateMerkmal (MKode, pMName, MaxMerkmalsLen, lIdent) == EC_OKAY) { MerkmalCreator MC (*this); Merkmal *pM = ContCreate (MC, Merkmal); bRet = pM && pM -> Init (pMName, MKode); } } // ggf. Speicher freigeben DELETE_VEC (pTempName); // ggf. Fehlermeldung ausgeben if (bRet == False) yyerror (IDS_SYSERROR); return bRet; }