⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ergraph.c

📁 这个工具集提供以下结构化分析和UML分析中所用的图形化绘图工具:ER-diagrams, data and event flow diagrams and state-transition diagr
💻 C
字号:
//////////////////////////////////////////////////////////////////////////////////// This file is part of Toolkit for Conceptual Modeling (TCM).// (c) copyright 1995, Vrije Universiteit Amsterdam.// Author: Frank Dehne (frank@cs.vu.nl).//// TCM is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// TCM is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with TCM; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA// 02111-1307, USA.////////////////////////////////////////////////////////////////////////////////#include "ergraph.h"#include "edge.h"#include "util.h"ERGraph::ERGraph(): Graph() {	int i=0;	int j=0;	nodeTypes[i++] = Code::COMMENT;	nodeTypes[i++] = Code::ENTITY_TYPE;	nodeTypes[i++] = Code::VALUE_TYPE;	nodeTypes[i++] = Code::TAXONOMY_JUNCTION;	nodeTypes[i++] = Code::RELATIONSHIP_NODE;	nodeTypes[i++] = 0;	edgeTypes[j++] = Code::BINARY_RELATIONSHIP;	edgeTypes[j++] = Code::FUNCTION;	edgeTypes[j++] = Code::EMPTY_EDGE;	edgeTypes[j++] = Code::ISA_RELATIONSHIP;	edgeTypes[j++] = 0;}Subject *ERGraph::GetGeneralization(Subject *subj) {	for (edges->first(); !edges->done(); edges->next()) {		Edge *edge = edges->cur();		if (edge->GetClassType()==Code::ISA_RELATIONSHIP) {			if (edge->GetSubject1() == subj)				return edge->GetSubject2();		}		else if (edge->GetClassType()==Code::EMPTY_EDGE) {			Subject *junction = 0;			if (edge->GetSubject1() == subj)				junction = edge->GetSubject2();			else if (edge->GetSubject2() == subj)				junction = edge->GetSubject1();			if (junction) {				List<Edge *> edges2 = *edges;				for (edges2.first(); !edges2.done(); edges2.next()) {					Edge *edge2 = edges2.cur();					if (edge2->GetClassType()==Code::ISA_RELATIONSHIP) {						if (edge2->GetSubject1() == junction)							return edge2->GetSubject2();					}				}			}		}	}	return 0;}bool ERGraph::IsaLeaves(Subject *subj) {	for (edges->first(); !edges->done(); edges->next()) {		Edge *edge = edges->cur();		Subject *n1 = edge->GetSubject1();		if (n1 == subj && edge->GetClassType()==Code::ISA_RELATIONSHIP) {			return True;		}	}	return False;}bool ERGraph::IsaPathExists(Subject *subj1, Subject *subj2) {	List<Edge *> path;	return IsaPathExists(subj1, subj2, &path);}bool ERGraph::IsaPathExists(Subject *subj1, Subject *subj2, List<Edge *> *path) {	// should be made more generic !!!	for (edges->first(); !edges->done(); edges->next()) {		Edge *edge = edges->cur();		Subject *n1 = edge->GetSubject1();		Subject *n2 = edge->GetSubject2();		bool step = False;		// is_a: only n1 -> n2.		int edgetype = edge->GetClassType();		int subj1type = subj1->GetClassType();		if (n1 == subj1 && edgetype==Code::ISA_RELATIONSHIP) {			step = True;		}		else if (edgetype==Code::EMPTY_EDGE && 			 (subj1type==Code::ENTITY_TYPE||subj1type==Code::CLASS_NODE) &&			 (n1 == subj1 || n2 == subj1)) {			step = True;			if (subj1==n2) {				Subject *tmp = n1;				n1 = n2;				n2 = tmp;			}		}		if (step) {			if (n2==subj2) {				path->add(edge);				return True;			}			else if (path->find(edge) == -1) {				path->add(edge);				if (IsaPathExists(n2, subj2, path))					return True;				path->remove(edge);				if (!edges->setcur(edge))					error("%s %d: internal graph error\n", 						__FILE__, __LINE__);			}			step = False;		}	} 	return False;}void ERGraph::InitConnections () {	int ENT = Code::GetIndex(Code::ENTITY_TYPE, nodeTypes);	int TAX = Code::GetIndex(Code::TAXONOMY_JUNCTION, nodeTypes);	int VAL = Code::GetIndex(Code::VALUE_TYPE, nodeTypes);	int REL = Code::GetIndex(Code::RELATIONSHIP_NODE, nodeTypes);	int FUN = Code::GetIndex(Code::FUNCTION, edgeTypes);	int MAN = Code::GetIndex(Code::BINARY_RELATIONSHIP, edgeTypes);	int EMP = Code::GetIndex(Code::EMPTY_EDGE, edgeTypes);	int ISA = Code::GetIndex(Code::ISA_RELATIONSHIP, edgeTypes);	connections[ENT][ENT][FUN] = True;	connections[ENT][ENT][MAN] = True;	connections[ENT][ENT][ISA] = True;	connections[ENT][VAL][FUN] = True;	connections[ENT][TAX][EMP] = True;	connections[TAX][ENT][EMP] = True;	connections[TAX][ENT][ISA] = True;	connections[REL][ENT][FUN] = True;	connections[REL][VAL][FUN] = True;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -