Wie kann ich automatisch jede Form mit dem darin enthaltenen Text für eine riesige Sammlung von Rechtecken gruppieren?

Ich habe eine .dwg(AutoCad-Datei) Karte voller Felder (Rechtecke), die ich mit Illustrator bearbeite. Jedes Rechteck enthält einen Text, der seine Nummer angibt. Das Problem ist, dass es keine Verbindung zwischen dem Rechteck und seiner Nummer gibt, und genau das versuche ich zu tun. Auch die Reihenfolge oder Zeichnung ist nicht gleich, wenn ich die Ebenen überprüfe.

Gibt es mit Illustrator eine Möglichkeit, jedes Rechteck mit dem darin enthaltenen Text zu gruppieren und dies für alle Felder? Es ist manuell möglich, aber unmöglich, dies für jedes einzelne Feld zu tun: etwa 40.000 Rechtecke.

Ich denke, der Ansatz sollte etwas mit "Nähe" zu tun haben, da dies die einzigen Daten sind, die uns die Entsprechung zwischen einem Rechteck und seiner Nummer mitteilen.

Was ist das endgültige Ziel, das Rechteck mit seiner Nummer zu gruppieren? Es könnte einen anderen Weg geben, um das zu erreichen, was Sie am Ende wollen.
Gibt es eine Möglichkeit, AutoCad zum Exportieren der Datei in ein besser verwendbares Format zu verwenden? Wenn mir in der Vergangenheit ähnliche Dinge präsentiert wurden (nachdem ich ein paar Minuten im Badezimmer geweint hatte), fand ich es einfacher, die Zeichnung in Illustrator von Grund auf neu zu erstellen (obwohl ich nie etwas tun musste mit so vielen Elementen).
Folgender Kommentar von @Voxwoman: Könntest du es vielleicht als .svgDatei exportieren? Dann wäre eine Skriptlösung möglich, die Rechteck- und Textobjekte mit benachbarten x-, y-Koordinaten in einem g-element platziert und sie im Wesentlichen gruppiert.
Illustrator kann DWG-Native öffnen, das heißt, es kann Blöcke, Xref, Formen und Objekte lesen. Sie können also Ihre DWG speichern und Ihre Rechtecke mit Blöcken und XRefs gruppieren und testen, auf welche Weise sie gut in Illustrator importiert werden können.
Dies ist eine einfache Aufgabe, wenn Sie in Illustrator erstellt werden. Wenn Sie jedoch eine andere Datei importieren, ist es nicht einfach, das zu erreichen, wonach Sie suchen.
Danke an alle. Hier sind weitere Informationen: @Bart, das Endziel ist es, die Nummer zu haben, die auf das Rechteck verweist, damit ich in einer Anwendung eine Nummer eingeben kann, um das entsprechende Rechteck anzuzeigen. Voxwoman: Sie haben Recht, aber in diesem Fall ist es nicht möglich, weil die Koordinaten jedes Rechtecks ​​echt und sehr genau sind: Ich denke, es ist nicht möglich, die gesamte Karte neu zu zeichnen. Ich habe die Datei in .svg exportiert. Ich habe den XML-Code. Ich glaube, dass eine Skriptlösung möglich ist, wie Bart erwähnt hat, aber ich habe mich gefragt, ob es einen einfacheren/schnelleren Weg über Illustrator geben könnte. Danke für deine Hilfe!!

Antworten (1)

Es gibt ein Plugin, das Ihnen dabei helfen kann. Sie können es hier herunterladen: http://www.wundes.com/JS4AI/index.php

Laden Sie „ GroupOverlappingObjects.js “ in Ihren Illustrator-Skriptordner herunter. Auf dem PC sollte es so aussehen:

„C:\Programme\Adobe\Illustrator CS\Presets\Scripts“

oder Mac

„/Applications/Adobe Illustrator CC 2015/Presets/en_US/Scripts“

Illustrator öffnen/neu laden und alle Objekte auswählen, die Sie gruppieren möchten. Dann geh zu:

Datei > Skripts > GroupOverlappingObjects

Es sollte ein Dialogfeld angezeigt werden, das Ihnen mitteilt, wie viele Gruppen erstellt wurden. Wenn Sie das Ebenenkästchen aktivieren, sollten Ihre neu gruppierten Elemente angezeigt werden.

Ich habe dies in Illustrator CC 2015 getestet.

Inhalt von Javascript (29.07.2015):

/////////////////////////////////////////////////////////////////
//Group Overlapping (Beta) -- CS, CS2, CS3
//>=--------------------------------------
//
//  Groups all overlapping objects in selection into discreet groups.
//  The definition for 'overlaping' is based on objects bounding boxes, not their actual geometry.
//  Each new groups zOrder is determined by the depth of the front-most object in each group.
//  There is no limit to the number of groups created.
//  Any non-overlapping objects are ignored.
//
// Note: Currently, this is not very efficient code. It works well on small groups (less than 120 objects)
// and works faster on smaller groupings. Running this on a huge number of objects will likely crash illustrator.
// It serves my purposes, but test it's limits on your machine, and use at your own risk. 
// On a 2.53GHz P4, a group of 100 objects took 20 seconds with 2 groups.
//  
//
//>=--------------------------------------
// JS code (c) copyright: John Wundes ( john@wundes.com ) www.wundes.com
//copyright full text here:  http://www.wundes.com/js4ai/copyright.txt
////////////////////////////////////////////////////////////////// 

//this little section is just for testing
//the number of times each function is called.
var testmode = 0;
var t1=t2=t3=t4=t5=t6=t7=0;
var testmsg="";
//
//
//
var go=true;
if(selection.length>120){
go = confirm("You have selected "+selection.length+" objects. It is highly recommended that you select less than 120 objects at a time. Do you want to continue anyway?");

}
if(selection.length>1 && go == true){
    var groups=0;
    var slen = selection.length;
    var hitList= new Array(slen);
    var groupArr = new Array(slen);
    // for each element in selection
    for (var sx=0;sx<slen;sx++){ 
    //t6++; //---------------------------------------------loop tracker
        var tArr = new Array(0);
            // for each element in selection (again)
        for (var si=0;si<slen;si++){
            //t7++; //-------------------------------------loop tracker
            groupArr[sx] = tArr;
            //note each object hits itself once.
            if(hitTest(selection[sx],selection[si])){
                    groupArr[sx].push(selection[si]);
            }
        }
    } 

minimize(groupArr);
var zError = 0;
var gaLen = groupArr.length;
for(var each=0;each<gaLen;each++){
    if(groupArr[each].length>1){
        groupArr[each].sort(sortBy_zOrder);
    }
if(zError==1){
    alert("cannot read some objects zOrderPosition");
}
//alert("halftime");
for(var each =0;each<gaLen;each++){ 
    t1++; //----------------------------------------------loop tracker
    if(groupArr[each].length>1){
        groups++;
    groupAll(groupArr[each]);
    }
}
//
//---all done with main code, now display statistics if you care...
//

testmsg="\nObjects processed: "+t1+"\nObjects grouped: "+t2+"\nObjects ignored: "+(t1-t2);

if(testmode==1){
testmsg+="\n\n---testmode data---\nhits compared: "+t5+"\nfunction 'minimize' called: "+t3+
"\nitems tested within 'minimize': "+t4;
"\nelements: "+t6+
"\nelements*elements: "+t7;
}

var x=0;

while(x<selection.length){

    if(selection[x].name == "wundes_GO_group"){
         selection[x].name = "";
    }else{
        selection[x].selected = false;
          x--;
    }
    x++;
}
redraw();
alert(groups+" groups created.\n----------------"+testmsg);
}


}
//----------------------------------------------------------->
//--------------------------------functions------------------<
//----------------------------------------------------------->
function sortBy_zOrder(a, b) {
        if(a.zOrderPosition==undefined){
            alert(a.zOrderPosition);
            zError = 1;
             return 0;
        }
        var x = Number(a.zOrderPosition);
        var y = Number(b.zOrderPosition);


return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function groupAll(arr){
    var tempGroup = arr[0].parent.groupItems.add();

    tempGroup.move(arr[0],ElementPlacement.PLACEBEFORE);
    var max = arr.length;
    for(var i=max-1;i>=0;i--){
        t2++; //-----------------------------------------loop tracker
        arr[i].move(tempGroup,ElementPlacement.INSIDE);
    }
        //name the object for selection at end... (will be removed later)
        tempGroup.name = "wundes_GO_group";
        tempGroup.selected = true;

}
//---------------hitTest functions ---------------
function hitTest(a,b){
    var OK=0;
    if(isWithinX(a,b) || isWithinX(b,a)){
        OK++;   
    }
    if(isWithinY(a,b) || isWithinY(b,a)){
        OK++;
    }
    if (OK<2){
        //alert("miss.");
        return false;
    }else{
        //alert("Hit!")
            return true;
    }
}
function isWithinX(a,b){
    var p1 = a.geometricBounds[0];
    var p2 = b.geometricBounds[0];
    if(p2<=p1 && p1<=p2+b.width){
         return true;
    }else{
        return false;
    } 
}
function isWithinY(a,b){
    var p3 = a.geometricBounds[1];
    var p4 = b.geometricBounds[1];
    if(p3>=p4 && p4>=(p3-a.height)){
        return true;
    } 
        return false;
}

/*
//-----------------------------------OK, finding groups is done, now do the grouping---------------
*/

function itemize(a){
 var out="";
 return(a.join("\n"));
}
function minimize(arr){
for(var e in arr){
    t3++; //-----------------------------------------loop tracker
    for (ot in arr){
        t4++; //-------------------------------------loop tracker
        if(arr[e]!=arr[ot]){
        //if it's not THIS element,
        //test for overlaps
        if(overlaps(arr[e],arr[ot])){
            merge(arr[e],arr[ot]);
            arr[e] = new Array(0);
            minimize(arr);
            break;
        }
        }
    }
}

}
function merge(a,b){
    var alen = a.length;
    for (var all=0;all<alen;all++){
        if(contains(b,a[all])){
            //do nothing
        }else{

         b.push(a[all]);

        }
    }

}
function contains(ar,i){
    for (var all in ar){
        if (ar[all] == i){
            return true;
        }
    }
return false;
}


function overlaps(ar1,ar2){
    for (var each in ar1){
        t5++; //------------------------------------loop tracker
        if(contains(ar2,ar1[each])){//
            return true;
        }
    }
return false;
}