diff --git a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java index 3b74a55cc92227af3d0c7bdb54590b8aca29ee53..2a13f96faf1d514ee20536f8d504857a4d989030 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java +++ b/src/main/java/com/hy/java/uct/umlrecog/ClassDiagramRecognizer.java @@ -5,16 +5,21 @@ import java.util.Set; import org.opencv.core.Core; import org.opencv.core.Mat; +import org.opencv.core.Scalar; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; import com.hy.java.uct.umlrecog.cddetector.ClassDetector; import com.hy.java.uct.umlrecog.cddetector.ClassRelationDetector; import com.hy.java.uct.umlrecog.util.Relation; import com.hy.java.uct.umlrecog.util.UMLClass; +import com.hy.java.utility.common.FileEditor; import com.hy.java.utility.common.Pair; import com.hy.java.utility.common.Traverser; import com.hy.java.utility.common.Traverser.FileNode; public class ClassDiagramRecognizer { + private static String temp_res_path = null; public static void recog(String cd_dir, String repo_name) { // 遍历cd_dir下的文件,寻找repo_name对应的图片,存在repo_cd_path中 @@ -33,13 +38,40 @@ public class ClassDiagramRecognizer { */ ClassRelationDetector cls_relation_detector = new ClassRelationDetector(repo_cd_path, classes); cls_relation_detector.recog(); - Set relations = cls_relation_detector.getResult(); + Pair> classes_with_relations = cls_relation_detector.getResult(); /* - * 整合文件吧,哈哈 + * 目前classes_with_relations中包含所有类。每个类包含这些信息:类名、属性、方法;关系(分为in和out) * - * 该做这儿了 - * - * 整合出来一个txt,包含类、关系等信息即可。然后再把结果画出来,用于验证、展示 + * 将所有类整合为一个txt,以每个类为划分,包含每个类的信息 + */ + FileEditor fe = new FileEditor("把结果写进这个路径里"); + List class_list = classes_with_relations.getRight(); + for (UMLClass UML_class : class_list) { + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + // 想想写的格式!!!!!!!!! + fe.write(UML_class.getTitle() + "\n", true); + fe.write(UML_class.getAttrisStr() + "\n", true); + fe.write(UML_class.getMethodsStr() + "\n", true); + for (Relation out_rel : UML_class.out_relas) { + + } + for (Relation in_rel : UML_class.in_relas) { + + } + } + /* + * 看一下识别情况。可注释掉 + */ + /* + * for (UMLClass UML_class : class_list) { Imgproc.rectangle(classes_with_relations.getLeft(), UML_class.whole, new Scalar(5, 5, 5), 3); } temp_res_path = "把识别结果画进这张图里"; + * Imgcodecs.imwrite(temp_res_path, classes_with_relations.getLeft()); */ } else { diff --git a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java index 25f5943ebdf9573a498b67fbd9ec9ac6c0ed0b20..bb0b4127823b56fd99e5c28ab7e5967843e2111f 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java +++ b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java @@ -27,7 +27,7 @@ public class ClassRelationDetector { private String cd_path = null; private String temp_res_path = null; private Pair> classes_in_cd = null; - private Set result = null; + private Pair> result = null; public ClassRelationDetector(String repo_cd_path, Pair> classes) { this.cd_path = repo_cd_path; @@ -40,9 +40,8 @@ public class ClassRelationDetector { Set solid_lines = detectLines(classes_in_cd, 0.0504, true); // 再检测虚线。虚线检测除了间隔设置与实线不同外,其他完全一样 Set dash_lines = detectLines(classes_in_cd, 0.0504, false); - // 再检测关系类型检测 - Set relation_with_types = detectRelationType(classes_in_cd, solid_lines, dash_lines, 0.0001); - result = relation_with_types; + // 再检测关系类型检测。由于会遍历所有关系,所以顺便将关系存在classes_in_cd中每个UMLClass的关系列表中 + result = detectRelationType(classes_in_cd, solid_lines, dash_lines, 0.0001); } private Set detectLines(Pair> classes_in_cd, double ratio, boolean detect_solid) { @@ -336,9 +335,8 @@ public class ClassRelationDetector { * @param dash_lines * @return */ - private Set detectRelationType(Pair> classes_in_cd, Set solid_lines, Set dash_lines, double ratio) { + private Pair> detectRelationType(Pair> classes_in_cd, Set solid_lines, Set dash_lines, double ratio) { System.out.println("开始识别" + cd_path + "中所有关系符号"); - Set result = new HashSet<>(); Mat cls_diagram = classes_in_cd.getLeft(); Mat origin_cls_diagram = Imgcodecs.imread(cd_path, Imgcodecs.IMREAD_GRAYSCALE); /* @@ -350,7 +348,7 @@ public class ClassRelationDetector { List contours = new ArrayList<>(); Imgproc.findContours(cls_diagram, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); /* - * 对每个轮廓contour,检测是否为某种关系符号,并将contour和检测结果存在Rectangle中。所有轮廓的检测结果最终存在rela_shapes中 + * 对每个轮廓contour,检测是否为某种关系符号 */ // 根据图片像素计算轮廓面积阈值。如果轮廓面积太小或太大,则直接忽略 long cd_area = cls_diagram.width() * cls_diagram.height(); @@ -391,8 +389,9 @@ public class ClassRelationDetector { } dash_rela.source_pt_index = 2; dash_rela.type = "实现"; - // 记录当前关系到result里 - result.add(dash_rela); + // 记录当前关系到UMLClass里 + dash_rela.source.out_relas.add(dash_rela); + dash_rela.target.in_relas.add(dash_rela); break; } else if (rect_containing_rela_type.contains(dash_rela.poly_line.pt2) || rect_containing_rela_type.contains(ImgProcessor.reachPt(dash_rela.poly_line.pt2, dash_rela.poly_line.l2, 5, false)) || rect_containing_rela_type.contains(ImgProcessor.reachPt(dash_rela.poly_line.pt2, dash_rela.poly_line.l2, 5, true))) { @@ -405,8 +404,9 @@ public class ClassRelationDetector { } dash_rela.source_pt_index = 1; dash_rela.type = "实现"; - // 记录当前关系到result里 - result.add(dash_rela); + // 记录当前关系到UMLClass里 + dash_rela.source.out_relas.add(dash_rela); + dash_rela.target.in_relas.add(dash_rela); break; } } @@ -478,18 +478,16 @@ public class ClassRelationDetector { type = "继承"; } /* - * 我就看看,不乱动 - */ - Imgproc.rectangle(cutted_origin_rela_type_area, rect_possible_containing_ext, new Scalar(5, 5, 5), 3); - Imgcodecs.imwrite(temp_res_path, cutted_origin_rela_type_area); - /* - * 看完了,可删 + * 看一下实线符号识别情况。可注释掉 */ + // Imgproc.rectangle(cutted_origin_rela_type_area, rect_possible_containing_ext, new Scalar(5, 5, 5), 3); + // Imgcodecs.imwrite(temp_res_path, cutted_origin_rela_type_area); } } solid_rela.type = type; // 记录当前关系到result里 - result.add(solid_rela); + solid_rela.source.out_relas.add(solid_rela); + solid_rela.target.in_relas.add(solid_rela); // 检测完符号类别后,对当前区域就算检测完了,不用再检测其他实线了 break; } @@ -497,11 +495,11 @@ public class ClassRelationDetector { // 如果运行到这儿(检测完符号类别后break会直接到这儿),说明对当前区域的包络矩形与实线之间的检测完毕。相当于对当前区域检测完毕,开始检测下一个区域 } } - System.out.println("完成对" + cd_path + "中识别关系符号的识别。最终获得带关系类型的关系共" + result.size() + "个"); - return result; + System.out.println("完成对" + cd_path + "中识别关系符号的识别。"); + return classes_in_cd; } - public Set getResult() { + public Pair> getResult() { return result; } } diff --git a/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java b/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java index bbbd1378ed406b12f30a0af609c0bc10364c319b..19833da35f72512620b82d68098fc5b50af8a2a5 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java +++ b/src/main/java/com/hy/java/uct/umlrecog/util/UMLClass.java @@ -19,7 +19,10 @@ public class UMLClass { private String title; private String attris_str; private String methods_str; - public List relas = new ArrayList<>(); + // 从该class出发的关系 + public List out_relas = new ArrayList<>(); + // 指向该class的关系 + public List in_relas = new ArrayList<>(); public String getTitle() { return title;