handle label geometry in YED files

This commit is contained in:
Alexey Fedoseev
2024-04-25 16:14:02 +03:00
parent dfe8a06102
commit f6c142fb6c

View File

@@ -1453,6 +1453,18 @@ static int node_stack_free(NodeStack** stack)
* The Cyberiada GraphML XML reader functions * The Cyberiada GraphML XML reader functions
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
static int cyberiada_has_attr(xmlNode* node, const char* attrname)
{
xmlAttr* attribute = node->properties;
while(attribute) {
if (strcmp((const char*)attribute->name, attrname) == 0) {
return CYBERIADA_NO_ERROR;
}
attribute = attribute->next;
}
return CYBERIADA_NOT_FOUND;
}
static int cyberiada_get_attr_value(char* buffer, size_t buffer_len, static int cyberiada_get_attr_value(char* buffer, size_t buffer_len,
xmlNode* node, const char* attrname) xmlNode* node, const char* attrname)
{ {
@@ -1878,6 +1890,7 @@ static GraphProcessorState handle_edge_label(xmlNode* xml_node,
{ {
char buffer[MAX_STR_LEN]; char buffer[MAX_STR_LEN];
size_t buffer_len = sizeof(buffer) - 1; size_t buffer_len = sizeof(buffer) - 1;
float x = 0.0, y = 0.0;
CyberiadaEdge *current; CyberiadaEdge *current;
CyberiadaSM* sm = doc->state_machines; CyberiadaSM* sm = doc->state_machines;
while (sm->next) sm = sm->next; while (sm->next) sm = sm->next;
@@ -1898,6 +1911,24 @@ static GraphProcessorState handle_edge_label(xmlNode* xml_node,
ERROR("cannot decode edge action\n"); ERROR("cannot decode edge action\n");
return gpsInvalid; return gpsInvalid;
} }
if (current->action &&
cyberiada_has_attr(xml_node, GRAPHML_GEOM_X_ATTRIBUTE) == CYBERIADA_NO_ERROR &&
cyberiada_has_attr(xml_node, GRAPHML_GEOM_Y_ATTRIBUTE) == CYBERIADA_NO_ERROR) {
if (cyberiada_xml_read_coord(xml_node, GRAPHML_GEOM_X_ATTRIBUTE, &x) == CYBERIADA_NO_ERROR &&
cyberiada_xml_read_coord(xml_node, GRAPHML_GEOM_Y_ATTRIBUTE, &y) == CYBERIADA_NO_ERROR) {
if (current->geometry_label_point) {
ERROR("Trying to set edge %s:%s label coordinates twice\n",
current->source_id, current->target_id);
return gpsInvalid;
}
current->geometry_label_point = cyberiada_new_point();
current->geometry_label_point->x = x;
current->geometry_label_point->y = y;
}
}
return gpsGraph; return gpsGraph;
} }