Skip to content

subgraph/cluster and class count #42

Closed
@llaville

Description

@llaville

Hello,

i'm currently working on a PHP solution based on your packages (here are my versions used)

graphp/graph                       dev-master 0d78233 GraPHP is the mathematical graph/network library written in PHP.
graphp/graphviz                    dev-master 5ad4f5d GraphViz graph drawing for the mathematical graph/network library GraPHP.

I've recently be aware that when there are many classes in a diagram, subgraph even with a single class, are displayed correctly.

But when there is only one namespace and one class, such as :

<?php
declare(strict_types=1);

namespace App;

class BackupProject
{
    private $a;
    private const B = 'b';
    public function __construct(string  $a)
    {
        $this->a = $a;
    }
}

subgraph is not generated and give such result :

data:image/png;base64,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

Statements code corresponding to this image are :

graph {
  graph [name="G" overlap="false"]
  node [fontname="Verdana" fontsize=8 shape="none" margin=0 fillcolor="#FEFECE" style="filled"]
  edge [fontname="Verdana" fontsize=8]
  "App\\BackupProject" [label=<
<table cellspacing="0" border="0" cellborder="1">
    <tr><td bgcolor="#eeeeee"><b>BackupProject</b></td></tr>
    <tr><td><table border="0" cellspacing="0" cellpadding="2">
<tr><td align="left">- a</td></tr>
</table></td></tr>
    <tr><td><table border="0" cellspacing="0" cellpadding="2">
<tr><td align="left">+ __construct()</td></tr>
</table></td></tr>
</table>> shape="none"]
}

While I'm expected to see the rectangle that show the namespace as follow

data:image/png;base64,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

Statements code corresponding to this image are :

graph {
  graph [name="G" overlap="false"]
  node [fontname="Verdana" fontsize=8 shape="none" margin=0 fillcolor="#FEFECE" style="filled"]
  edge [fontname="Verdana" fontsize=8]
  subgraph cluster_0 {
    label = "App"
    "App\\BackupProject" [label=<
<table cellspacing="0" border="0" cellborder="1">
    <tr><td bgcolor="#eeeeee"><b>BackupProject</b></td></tr>
    <tr><td><table border="0" cellspacing="0" cellpadding="2">
<tr><td align="left">- a</td></tr>
</table></td></tr>
    <tr><td><table border="0" cellspacing="0" cellpadding="2">
<tr><td align="left">+ __construct()</td></tr>
</table></td></tr>
</table>> shape="none"]
  }
}

To produce such result, i've just changed one line in your code : https://github.com/graphp/graphviz/blob/master/src/GraphViz.php#L283

if (count($groups) > 0) {

Tell me what you think, and if you're agree with this change !

Thanks
Laurent

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions