Сделайте пятна на фигурах, нажав на фигуру в GOJS

Я использую GOJS, и я хочу сделать точку всякий раз, когда я нажимаю на форму. Точка должна появляться точно в той позиции, где я щелкнул по фигуре. Могу ли я это сделать? вот мой код, я добавил точки или порты жестко закодированы

function makePort(name, spot, output, input) {
      return GO(go.Shape, "Circle",
               {
                  fill: "grey",  
                  stroke: null,
                  desiredSize: new go.Size(10, 10),
                  alignment: spot, 
                  alignmentFocus: spot,  
                  portId: name, 
                  fromSpot: spot, toSpot: spot,  
                  fromLinkable: output, toLinkable: input,  
                  cursor: "pointer"  
               });
    }
 myDiagram.nodeTemplate =
     GO(go.Node, "Spot",
     {

       selectionAdorned: false,  // don't show the standard selection handle
       resizable: true, resizeObjectName: "SHAPE",  // user can resize the Shape
        rotatable: true, rotateObjectName: "SHAPE",  // user can rotate the Shape
                                                     // without rotating the label
        layoutConditions: go.Part.LayoutStandard & ~go.Part.LayoutNodeSized
      },
      new go.Binding("location", "loc").makeTwoWay(),  // TwoWay Binding // Binds diagram and model location with eachother 
      a = GO(go.Shape,
        {
          click:click1,
          name: "SHAPE",
          width: 70, height: 70,
          stroke: "#000000",
          fill: "transparent",
          //angle: 45,
          strokeWidth: 1
        },
        new go.Binding("figure","fig"),
        new go.Binding("name_shape", "key"),
       new go.Binding("angle", "ang").makeTwoWay(),  // Binds diagram and model angle with eachother 
        // new go.Binding("desiredSize", "size").makeTwoWay(), // Binds diagram and model size with eachother 
        new go.Binding("geometryString", "geometry").makeTwoWay()),// Binds diagram and model geometry string with eachother 
      // GO(go.Shape,"Circle",  // the "A" port
      //       { width: 20, height: 20, portId: "A",stroke:null,toSpot: go.Spot.Left}),
      /*GO(go.Panel, "Vertical",
        GO(go.TextBlock,
          new go.Binding("text", "fig")),
        GO(go.TextBlock, { stroke: "blue" },
          new go.Binding("text", "parameter1", function(p1) { return p1; }).ofObject("SHAPE"))
      )*/
       // GO(go.Shape,  // the "A" port
       //      { width: 6, height: 6, portId: "A" }),

      // four small named ports, one on each side:
        makePort("T", go.Spot.Top, false, true),
        makePort("L", go.Spot.Left, true, true),
        makePort("TL", go.Spot.TopLeft, true, true),
        makePort("BL", go.Spot.BottomLeft, true, true),
        makePort("R", go.Spot.Right, true, true),
        makePort("TR", go.Spot.TopRight, true, true),
        makePort("BR", go.Spot.BottomRight, true, true),
        makePort("B", go.Spot.Bottom, true, true),
        makePort("C",go.Spot.Center,true,true),

        { // handle mouse enter/leave events to show/hide the ports
          mouseEnter: function(e, node) { showSmallPorts(node, true); },
          mouseLeave: function(e, node) { showSmallPorts(node, false); }
        }
    );

     function showSmallPorts(node, show) {
      node.ports.each(function(port) {
        if (port.portId !== "") {  // don't change the default port, which is the big shape
          port.fill = show ? "rgba(0,0,0,.3)" : null;
        }
      });

1 ответ

Решение

Это должно сделать то, что я думаю, что вы просите:

  function init() {
    var $ = go.GraphObject.make;

    myDiagram =
      $(go.Diagram, "myDiagramDiv",
        { initialContentAlignment: go.Spot.Center, "undoManager.isEnabled": true });

    myDiagram.nodeTemplate =
      $(go.Node, "Spot",
        { selectionObjectName: "BODY" },
        new go.Binding("itemArray", "spots"),
        { // each spot is represented by a Panel holding a circular Shape
          // at a particular alignment relative to the "BODY"
          itemTemplate:
            $(go.Panel,
              $(go.Shape, "Circle",
                {
                  fill: $(go.Brush, go.Brush.Radial, { 0.0: "gray", 1.0: "transparent" }),
                  strokeWidth: 0, width: 16, height: 16
                }),
              new go.Binding("alignment", "spot", go.Spot.parse).makeTwoWay(go.Spot.stringify)
            ),
          // when the user clicks on the node, add a "spot"
          click: function(e, obj) {
            e.diagram.startTransaction();
            // convert click point into Spot in node's bounds
            var pt = e.documentPoint;  // in document coordinates
            var node = obj.part;
            var b = node.actualBounds;  // will be in document coordinates
            var spot = new go.Spot(Math.max(0, Math.min((pt.x - b.x) / b.width, 1)),
                                   Math.max(0, Math.min((pt.y - b.y) / b.height, 1)));
            // add an Object describing the spot's location (as a Spot value)
            var spotsArray = node.data.spots;
            if (!Array.isArray(spotsArray)) spotsArray = node.data.spots = [];
            e.diagram.model.addArrayItem(spotsArray, { spot: go.Spot.stringify(spot) });
            e.diagram.commitTransaction("added spot");
          }
        },
        $(go.Panel, "Auto",
          { name: "BODY", width: 100, height: 100 },
          $(go.Shape, { fill: "whitesmoke" }),
          $(go.TextBlock, { editable: true },
            new go.Binding("text").makeTwoWay())
        )
      );

    myDiagram.model = $(go.GraphLinksModel,
      {
        copiesArrays: true,  // make sure the data.spots Array is copied
        copiesArrayObjects: true,  // make sure the Objects in those Arrays are also copied
        nodeDataArray: [
          { key: 1, text: "Alpha", spots: [] },
          { key: 2, text: "Beta", spots: [{ spot: "0.3, 0.2" }] }
        ],
        linkDataArray: [
          { from: 1, to: 2 }
        ]
      });
  }

Выполнение этого и нажатие на узлы в нескольких местах приводит к: Два узла с некоторыми пятнами добавляются нажатием на них

Обратите внимание, что бета-узел начинается с точки, как определено в данных модели.

Кстати, мне не было ясно, что "пятна", которые пользователь хочет добавить, действительно должны были быть "портами". Вы можете сделать каждое "пятно" "портом", присвоив ему уникальный GraphObject.portId.

Возможно, вы захотите прочитать все страницы Введение в GoJS по адресу http://gojs.net/latest/intro.

Другие вопросы по тегам