Hello,
there is a problem by instert several objects (dxf drawings) into a model.
I habe an array of dxf drawings.
So I want to insert all this into the same model.
A foreach loop is in use where the methode "AddToModel" is called serval times.
//Klasseninstanz erzeugen und Get/Set ausführen
Element element = serializer.Deserialize<Element>(_strObject);
element.SetAppRechte = sAppRechte;
//Model behandeln----------------------------
//Bei Überlagerung mehrer Zeichnungen wird eine Schleife gebildet; Die Prüfung auf Existenz des Arrays "dxf" ist bereits erfolgt
foreach (string strSingleDxf in dxf)
{
strPfadElem = _model.GetSetPfadElement + "\\" + strSingleDxf; //Dateipfad des Elements generieren
if (element.AddToModel(_MapModel, strPfadElem, ref strLogTemp))
iDrawSet++;
if (!strLogTemp.Equals(string.Empty))
_strLoggMsg += _strLoggMsg != "" ? "\n\r" : "" + strLogTemp;
}
Here is the methode "AddToModel" and "AddEntities" of my class element.
The position of x axis an y axis is allways the same: PosX = 20.0, PosY = -50.0.
/// <summary>
/// Fügt ein Element dem Gesamt Model hinzu
/// </summary>
/// <param name="mapAModel">Gibt eine List aller vorhanden Models an</param>
/// <param name="strPfadElem">Gibt den Dateipfad des Elements an welches in das Gesamtmodel eingefügt werden soll</param>
/// <param name="strLoggMsg">Gibt eine Referenz auf den Log-String an</param>
/// <returns>Ist der Clone des Elements erfolgreich im Gesamtmodel eingefügt dann ist Rückgabewert "true", ansonsten "false"</returns>
internal bool AddToModel(Dictionary<string, MyModel> mapAModel, string strPfadElem, ref string strLoggMsg)
{
bool BRet = false;
double dRot = 0.0;
List<string> liLayerName = new List<string>();
List<string> liPathEntity = new List<string>();
string strLayerTemp = string.Empty, strLayerModel = string.Empty, strTemp = string.Empty;
MyModel model = mapAModel["basic"];
//Zeichnungspfad analysieren
strTemp = Path.GetDirectoryName(strPfadElem);
if(strTemp.Equals(string.Empty))
liPathEntity.Add("Verzeichnis fehlt");
strTemp = Path.GetFileName(strPfadElem);
if (strTemp.Equals(string.Empty))
liPathEntity.Add("Dateiname fehlt");
strTemp = Path.GetExtension(strPfadElem);
if (strTemp.Equals(string.Empty))
liPathEntity.Add("Dateityp fehlt");
else if(!strTemp.Equals(".dxf"))
liPathEntity.Add("Dateityp nicht kompatibel");
if (liPathEntity.Count.Equals(0))
{
//Ermitteln, welche Layer im "model" aktiviert sind
foreach (var lay in model.Layers)
{
//Layer "0" ausblenden oder nicht
if (lay.Name != "0")
{
liLayers.Add(lay);
liLayerName.Add(lay.Name);
}
}
//Drehrichtung definieren; Wird bereits beim Clonen des Model angewendet
dRot = Rot * (sAppRechte.BDxfRotPositivRechts ? -1.0 : 1.0);
//Datei in Dxf-Model einlesen und Model clonen
DxfModel targetModel = new DxfModel();
DxfModel sourceModel = DxfReader.Read(strPfadElem);
if (Model.CloneModel(sourceModel, targetModel, dRot))
{
targetModel.ResetHandles();
addLineTypes(model, targetModel);
addLayerColors(model, targetModel);
BRet = AddEntities(model, targetModel, ref strLayerTemp);
if (!BRet)
{
strLayerModel = String.Join(",", liLayerName.ToArray());
//Meldung generieren: Keiner Layer der Zeichnung kann verwendet werden.
strLoggMsg = "Kein erforderlicher Layer konnte in der Zeichnung ermittelt werden";
strLoggMsg += string.Format("\r\nZeichnung: {0}", strPfadElem);
strLoggMsg += string.Format("\r\nErforderliche Layer: {0}", strLayerModel);
strLoggMsg += string.Format("\r\nVorhandene Layer: {0}", strLayerTemp);
}
}
else
{
//Meldung generieren: Von der Datei konnten keine Kopie angelegt werdern.
strLoggMsg = string.Format("Von der angegebenen Quelle \"{0}\" konnte kein Kopie angelegt werden", strPfadElem);
}
}
else
{
strTemp = String.Join(", ", liPathEntity.ToArray());
strLoggMsg = "Auf die Zeichnung kann nicht zugegriffen werden da der Pfad nicht korrekt ist";
strLoggMsg += "\n\r" + string.Format("Folgende Fehler sind aufgetreten: {0}", strTemp);
}
return BRet;
}
private bool AddEntities(DxfModel model, DxfModel templateModel, ref string strLayerTemp)
{
bool BRet = false;
List<string> liLayerTemp = new List<string>();
//Matrix4D rotationMatrix = Transformation4D.RotateZ(0.0 * Math.PI);
foreach (DxfEntity item in templateModel.Entities)
{
if (liLayers.Find(item.Layer.Equals) != null)
{
item.TransformMe(new TransformConfig(), Transformation4D.Translation(PosX, PosY, 0));
model.Entities.Add(item);
BRet = true;
}
foreach (DxfLayer dxfLayer in liLayers)
{
if (dxfLayer.Name == item.Layer.Name)
{
item.TransformMe(new TransformConfig(), Transformation4D.Translation(PosX, PosY, 0));
model.Entities.Add(item);
BRet = true;
}
else
{
//Liste der Layers die im templateMode gesucht werden erstellen
if(!liLayerTemp.Contains(item.Layer.Name))
liLayerTemp.Add(item.Layer.Name);
}
}
}
if(liLayerTemp.Count > 0)
strLayerTemp = String.Join(",", liLayerTemp.ToArray());
return BRet;
}
The result is that the drawings (arrows) are landing on several positions like a cascade.
Positions from the middel to bottom right.
Elements.pdf and Elements.dxf
Is there something I forgot to do.
Reset a target model or a template model or other things?
Thanks for help!