update viewer and add more field for exporter
This commit is contained in:
parent
2173836255
commit
b261712661
|
@ -54,51 +54,51 @@ void database::open(const char* file) {
|
|||
|
||||
//init table
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE script('thisobj' INTEGER, 'name' TEXT, 'index' INTEGER, 'behavior' INTEGER);",
|
||||
"CREATE TABLE script([thisobj] INTEGER, [name] TEXT, [index] INTEGER, [behavior] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE behavior('thisobj' INTEGER, 'name' TEXT, 'type' INTEGER, 'proto_name' TEXT, 'proto_guid' TEXT, 'flags' INTEGER, 'priority' INTEGER, 'version' INTEGER, 'pin_count' TEXT, 'parent' INTEGER);",
|
||||
"CREATE TABLE behavior([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [proto_name] TEXT, [proto_guid] TEXT, [flags] INTEGER, [priority] INTEGER, [version] INTEGER, [pin_count] TEXT, [parent] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pTarget('thisobj' INTEGER, 'name' TEXT, 'type' TEXT, 'type_guid' TEXT, 'belong_to' INTEGER, 'direct_source' INTEGER, 'shard_source' INTEGER);",
|
||||
"CREATE TABLE pTarget([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [belong_to] INTEGER, [direct_source] INTEGER, [shard_source] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pIn('thisobj' INTEGER, 'index' INTEGER, 'name' TEXT, 'type' TEXT, 'type_guid' TEXT, 'belong_to' INTEGER, 'direct_source' INTEGER, 'shard_source' INTEGER);",
|
||||
"CREATE TABLE pIn([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [belong_to] INTEGER, [direct_source] INTEGER, [shard_source] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pOut('thisobj' INTEGER, 'index' INTEGER, 'name' TEXT, 'type' TEXT, 'type_guid' TEXT, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE pOut([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE bIn('thisobj' INTEGER, 'index' INTEGER, 'name' TEXT, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE bIn([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE bOut('thisobj' INTEGER, 'index' INTEGER, 'name' TEXT, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE bOut([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE bLink('input' INTEGER, 'output' INTEGER, 'delay' INTEGER, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE bLink([input] INTEGER, [output] INTEGER, [delay] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_index] INETEGR, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pLocal('thisobj' INTEGER, 'name' TEXT, 'type' TEXT, 'type_guid' TEXT, 'is_setting' INTEGER, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE pLocal([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [is_setting] INTEGER, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pLocalData('field' TEXT, 'data' TEXT, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE pLocalData([field] TEXT, [data] TEXT, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pLink('input' INTEGER, 'output' INTEGER, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE pLink([input] INTEGER, [output] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_is_bb] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_is_bb] INTEGER, [output_index] INETEGR, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
result = sqlite3_exec(db,
|
||||
"CREATE TABLE pOper('thisobj' INTEGER, 'op' TEXT, 'op_guid' TEXT, 'belong_to' INTEGER);",
|
||||
"CREATE TABLE pOper([thisobj] INTEGER, [op] TEXT, [op_guid] TEXT, [belong_to] INTEGER);",
|
||||
NULL, NULL, &errmsg);
|
||||
if (result != SQLITE_OK) goto fail;
|
||||
|
||||
|
@ -119,12 +119,12 @@ void database::close() {
|
|||
sqlite3_exec(db, "commit;", NULL, NULL, &errmsg);
|
||||
|
||||
//create index for quick select in following app
|
||||
sqlite3_exec(db, "begin;", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX 'quick_where1' ON bIn (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX 'quick_where2' ON bOut (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX 'quick_where3' ON pIn (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX 'quick_where4' ON pOut (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "commit;", NULL, NULL, &errmsg);
|
||||
/*sqlite3_exec(db, "begin;", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX [quick_where1] ON bIn (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX [quick_where2] ON bOut (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX [quick_where3] ON pIn (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "CREATE INDEX [quick_where4] ON pOut (thisobj)", NULL, NULL, &errmsg);
|
||||
sqlite3_exec(db, "commit;", NULL, NULL, &errmsg);*/
|
||||
|
||||
//release res
|
||||
sqlite3_close(db);
|
||||
|
@ -244,10 +244,16 @@ void database::write_bOut(db_bOut* data) {
|
|||
void database::write_bLink(db_bLink* data) {
|
||||
if (db == NULL) return;
|
||||
|
||||
sprintf(commandStr, "INSERT INTO bLink VALUES (%d, %d, %d, %d);",
|
||||
sprintf(commandStr, "INSERT INTO bLink VALUES (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d);",
|
||||
data->input,
|
||||
data->output,
|
||||
data->delay,
|
||||
data->input_obj,
|
||||
data->input_type,
|
||||
data->input_index,
|
||||
data->output_obj,
|
||||
data->output_type,
|
||||
data->output_index,
|
||||
data->belong_to);
|
||||
|
||||
sqlite3_exec(db, commandStr, NULL, NULL, &errmsg);
|
||||
|
@ -271,9 +277,17 @@ void database::write_pLocal(db_pLocal* data) {
|
|||
void database::write_pLink(db_pLink* data) {
|
||||
if (db == NULL) return;
|
||||
|
||||
sprintf(commandStr, "INSERT INTO pLink VALUES (%d, %d, %d);",
|
||||
sprintf(commandStr, "INSERT INTO pLink VALUES (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);",
|
||||
data->input,
|
||||
data->output,
|
||||
data->input_obj,
|
||||
data->input_type,
|
||||
data->input_is_bb,
|
||||
data->input_index,
|
||||
data->output_obj,
|
||||
data->output_type,
|
||||
data->output_is_bb,
|
||||
data->output_index,
|
||||
data->belong_to);
|
||||
|
||||
sqlite3_exec(db, commandStr, NULL, NULL, &errmsg);
|
||||
|
|
|
@ -7,6 +7,16 @@
|
|||
#pragma region data struct define
|
||||
|
||||
typedef long EXPAND_CK_ID;
|
||||
enum bLinkInputOutputType {
|
||||
bLinkInputOutputType_INPUT,
|
||||
bLinkInputOutputType_OUTPUT
|
||||
};
|
||||
enum pLinkInputOutputType {
|
||||
pLinkInputOutputType_PIN,
|
||||
pLinkInputOutputType_POUT,
|
||||
pLinkInputOutputType_PLOCAL, //when using pLocal, omit [index] and [input_is_bb]
|
||||
pLinkInputOutputType_PTARGET //when using pTarget, omit [index] and [input_is_bb]
|
||||
};
|
||||
|
||||
typedef struct dbCKBehavior {
|
||||
EXPAND_CK_ID thisobj;
|
||||
|
@ -73,6 +83,14 @@ typedef struct db_bLink {
|
|||
EXPAND_CK_ID output;
|
||||
int delay;
|
||||
EXPAND_CK_ID belong_to;
|
||||
|
||||
//additional field
|
||||
EXPAND_CK_ID input_obj;
|
||||
bLinkInputOutputType input_type;
|
||||
int input_index;
|
||||
EXPAND_CK_ID output_obj;
|
||||
bLinkInputOutputType output_type;
|
||||
int output_index;
|
||||
};
|
||||
|
||||
typedef struct db_pLocal {
|
||||
|
@ -94,6 +112,16 @@ typedef struct db_pLink {
|
|||
EXPAND_CK_ID input;
|
||||
EXPAND_CK_ID output;
|
||||
EXPAND_CK_ID belong_to;
|
||||
|
||||
//additional field
|
||||
EXPAND_CK_ID input_obj;
|
||||
pLinkInputOutputType input_type;
|
||||
BOOL input_is_bb;
|
||||
int input_index;
|
||||
EXPAND_CK_ID output_obj;
|
||||
pLinkInputOutputType output_type;
|
||||
BOOL output_is_bb;
|
||||
int output_index;
|
||||
};
|
||||
|
||||
typedef struct db_pOper {
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
#include "script_export.h"
|
||||
//disable shit tip
|
||||
#pragma warning(disable:26812)
|
||||
|
||||
#define changeSuffix(a) prefix[endIndex]='\0';strcat(prefix,a)
|
||||
|
||||
|
@ -17,7 +19,7 @@ inline void proc_pTarget(CKParameterIn* cache, database* db, dbDataStructHelper*
|
|||
db->write_pTarget(helper->_db_pTarget);
|
||||
}
|
||||
|
||||
inline void proc_pIn(CKParameterIn* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index) {
|
||||
inline void proc_pIn(CKParameterIn* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index, BOOL executedFromBB) {
|
||||
helper->_db_pIn->thisobj = cache->GetID();
|
||||
helper->_db_pIn->index = index;
|
||||
strcpy(helper->_db_pIn->name, cache->GetName());
|
||||
|
@ -31,18 +33,72 @@ inline void proc_pIn(CKParameterIn* cache, database* db, dbDataStructHelper* hel
|
|||
db->write_pIn(helper->_db_pIn);
|
||||
|
||||
//=========try generate pLink
|
||||
EXPAND_CK_ID origin = -1;
|
||||
if (cache->GetDirectSource()) origin = cache->GetDirectSource()->GetID();
|
||||
if (cache->GetSharedSource()) origin = cache->GetSharedSource()->GetID();
|
||||
if (origin == -1) return;
|
||||
helper->_db_pLink->input = origin;
|
||||
//WARNING: i only choose one between [DirectSource] and [SharedSource] bucause i don't find any pIn both have these two field
|
||||
CKParameter* directSource = NULL;
|
||||
CKObject* ds_Owner = NULL;
|
||||
CKParameterIn* sharedSource = NULL;
|
||||
CKBehavior* ss_Owner = NULL;
|
||||
if (directSource = cache->GetDirectSource()) {
|
||||
helper->_db_pLink->input = directSource->GetID();
|
||||
if (directSource->GetClassID() == CKCID_PARAMETERLOCAL) {
|
||||
//pLocal
|
||||
helper->_db_pLink->input_obj = directSource->GetID();
|
||||
helper->_db_pLink->input_type = pLinkInputOutputType_PLOCAL;
|
||||
helper->_db_pLink->input_is_bb = FALSE;
|
||||
helper->_db_pLink->input_index = -1;
|
||||
} else {
|
||||
//pOut
|
||||
ds_Owner = directSource->GetOwner();
|
||||
helper->_db_pLink->input_obj = ds_Owner->GetID();
|
||||
helper->_db_pLink->input_type = pLinkInputOutputType_POUT;
|
||||
//WARNING: untested doe to GetClassID() may have chance to return Attributes or CKDataArray accoring to document
|
||||
if (helper->_db_pLink->input_index = (ds_Owner->GetClassID() != CKCID_PARAMETEROPERATION)) {
|
||||
//bb
|
||||
helper->_db_pLink->input_index = ((CKBehavior*)ds_Owner)->GetOutputParameterPosition((CKParameterOut*)directSource);
|
||||
|
||||
} else {
|
||||
//pOper
|
||||
helper->_db_pLink->input_index = 0;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sharedSource = cache->GetSharedSource()) {
|
||||
//pIn from BB
|
||||
helper->_db_pLink->input = sharedSource->GetID();
|
||||
ss_Owner = (CKBehavior*)sharedSource->GetOwner();
|
||||
helper->_db_pLink->input_obj = ss_Owner->GetID();
|
||||
|
||||
if (ss_Owner->IsUsingTarget() && (ss_Owner->GetTargetParameter() == sharedSource)) {
|
||||
//pTarget
|
||||
helper->_db_pLink->input_type = pLinkInputOutputType_PTARGET;
|
||||
helper->_db_pLink->input_is_bb = TRUE;
|
||||
helper->_db_pLink->input_index = -1;
|
||||
|
||||
} else {
|
||||
//pIn
|
||||
helper->_db_pLink->input_type = pLinkInputOutputType_PIN;
|
||||
helper->_db_pLink->input_is_bb = TRUE;
|
||||
helper->_db_pLink->input_index = ss_Owner->GetInputParameterPosition(sharedSource);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (sharedSource != NULL || directSource != NULL) {
|
||||
helper->_db_pLink->output = cache->GetID();
|
||||
helper->_db_pLink->output_obj = parents;
|
||||
helper->_db_pLink->output_type = pLinkInputOutputType_PIN;
|
||||
helper->_db_pLink->output_is_bb = executedFromBB;
|
||||
helper->_db_pLink->output_index = index;
|
||||
helper->_db_pLink->belong_to = grandparents;
|
||||
|
||||
db->write_pLink(helper->_db_pLink);
|
||||
}
|
||||
|
||||
inline void proc_pOut(CKParameterOut* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index) {
|
||||
}
|
||||
|
||||
inline void proc_pOut(CKParameterOut* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index, BOOL executedFromBB) {
|
||||
helper->_db_pOut->thisobj = cache->GetID();
|
||||
helper->_db_pOut->index = index;
|
||||
strcpy(helper->_db_pOut->name, cache->GetName());
|
||||
|
@ -55,11 +111,35 @@ inline void proc_pOut(CKParameterOut* cache, database* db, dbDataStructHelper* h
|
|||
|
||||
//=========try generate pLink
|
||||
CKParameter* cache_Dest = NULL;
|
||||
CKObject* cache_DestOwner = NULL;
|
||||
for (int j = 0, jCount = cache->GetDestinationCount(); j < jCount; j++) {
|
||||
cache_Dest = cache->GetDestination(j);
|
||||
|
||||
helper->_db_pLink->input = cache->GetID();
|
||||
helper->_db_pLink->input_obj = parents;
|
||||
helper->_db_pLink->input_type = pLinkInputOutputType_POUT;
|
||||
helper->_db_pLink->input_is_bb = executedFromBB;
|
||||
helper->_db_pLink->input_index = index;
|
||||
|
||||
helper->_db_pLink->output = cache_Dest->GetID();
|
||||
if (cache_Dest->GetClassID() == CKCID_PARAMETERLOCAL) {
|
||||
//pLocal
|
||||
helper->_db_pLink->output_obj = cache_Dest->GetID();
|
||||
helper->_db_pLink->output_type = pLinkInputOutputType_PLOCAL;
|
||||
helper->_db_pLink->output_is_bb = FALSE;
|
||||
helper->_db_pLink->output_index = -1;
|
||||
|
||||
} else {
|
||||
//pOut, it must belong to a BB
|
||||
|
||||
cache_DestOwner = cache_Dest->GetOwner();
|
||||
helper->_db_pLink->output_obj = cache_DestOwner->GetID();
|
||||
helper->_db_pLink->output_type = pLinkInputOutputType_POUT;
|
||||
helper->_db_pLink->output_is_bb = TRUE;
|
||||
helper->_db_pLink->output_index = ((CKBehavior*)cache_DestOwner)->GetOutputParameterPosition((CKParameterOut*)cache_Dest);
|
||||
|
||||
}
|
||||
|
||||
helper->_db_pLink->belong_to = grandparents;
|
||||
|
||||
db->write_pLink(helper->_db_pLink);
|
||||
|
@ -85,8 +165,15 @@ inline void proc_bOut(CKBehaviorIO* cache, database* db, dbDataStructHelper* hel
|
|||
}
|
||||
|
||||
inline void proc_bLink(CKBehaviorLink* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents) {
|
||||
helper->_db_bLink->input = cache->GetInBehaviorIO()->GetID();
|
||||
helper->_db_bLink->output = cache->GetOutBehaviorIO()->GetID();
|
||||
CKBehaviorIO* io = cache->GetInBehaviorIO();
|
||||
helper->_db_bLink->input = io->GetID();
|
||||
helper->_db_bLink->input_type = (io->GetType() == CK_BEHAVIORIO_IN ? bLinkInputOutputType_INPUT : bLinkInputOutputType_OUTPUT);
|
||||
helper->_db_bLink->input_index = (io->GetType() == CK_BEHAVIORIO_IN ? io->GetOwner()->GetInputPosition(io) : io->GetOwner()->GetOutputPosition(io));
|
||||
io = cache->GetOutBehaviorIO();
|
||||
helper->_db_bLink->output = io->GetID();
|
||||
helper->_db_bLink->output_type = (io->GetType() == CK_BEHAVIORIO_IN ? bLinkInputOutputType_INPUT : bLinkInputOutputType_OUTPUT);
|
||||
helper->_db_bLink->output_index = (io->GetType() == CK_BEHAVIORIO_IN ? io->GetOwner()->GetInputPosition(io) : io->GetOwner()->GetOutputPosition(io));
|
||||
|
||||
helper->_db_bLink->delay = cache->GetActivationDelay();
|
||||
helper->_db_bLink->belong_to = parents;
|
||||
|
||||
|
@ -118,9 +205,9 @@ inline void proc_pOper(CKParameterOperation* cache, database* db, dbDataStructHe
|
|||
db->write_pOper(helper->_db_pOper);
|
||||
|
||||
//export 2 input param and 1 output param
|
||||
proc_pIn(cache->GetInParameter1(), db, helper, cache->GetID(), parents, 0);
|
||||
proc_pIn(cache->GetInParameter2(), db, helper, cache->GetID(), parents, 1);
|
||||
proc_pOut(cache->GetOutParameter(), db, helper, cache->GetID(), parents, 0);
|
||||
proc_pIn(cache->GetInParameter1(), db, helper, cache->GetID(), parents, 0, FALSE);
|
||||
proc_pIn(cache->GetInParameter2(), db, helper, cache->GetID(), parents, 1, FALSE);
|
||||
proc_pOut(cache->GetOutParameter(), db, helper, cache->GetID(), parents, 0, FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
@ -201,10 +288,10 @@ void IterateBehavior(CKBehavior* bhv, database* db, dbDataStructHelper* helper,
|
|||
int count = 0, i = 0;
|
||||
//pIn
|
||||
for (i = 0, count = bhv->GetInputParameterCount(); i < count; i++)
|
||||
proc_pIn(bhv->GetInputParameter(i), db, helper, bhv->GetID(), parents, i);
|
||||
proc_pIn(bhv->GetInputParameter(i), db, helper, bhv->GetID(), parents, i, TRUE);
|
||||
//pOut
|
||||
for (i = 0, count = bhv->GetOutputParameterCount(); i < count; i++)
|
||||
proc_pOut(bhv->GetOutputParameter(i), db, helper, bhv->GetID(), parents, i);
|
||||
proc_pOut(bhv->GetOutputParameter(i), db, helper, bhv->GetID(), parents, i, TRUE);
|
||||
//bIn
|
||||
for (i = 0, count = bhv->GetInputCount(); i < count; i++)
|
||||
proc_bIn(bhv->GetInput(i), db, helper, bhv->GetID(), i);
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
#include "database.h"
|
||||
|
||||
inline void proc_pTarget(CKParameterIn* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents);
|
||||
inline void proc_pIn(CKParameterIn* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index);
|
||||
inline void proc_pOut(CKParameterOut* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index);
|
||||
inline void proc_pIn(CKParameterIn* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index, BOOL executedFromBB);
|
||||
inline void proc_pOut(CKParameterOut* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, EXPAND_CK_ID grandparents, int index, BOOL executedFromBB);
|
||||
inline void proc_bIn(CKBehaviorIO* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, int index);
|
||||
inline void proc_bOut(CKBehaviorIO* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents, int index);
|
||||
inline void proc_bLink(CKBehaviorLink* cache, database* db, dbDataStructHelper* helper, EXPAND_CK_ID parents);
|
||||
|
|
|
@ -2,12 +2,10 @@ FONT_SIZE = 12
|
|||
|
||||
GRAPH_POFFSET = 40
|
||||
GRAPH_BOFFSET = 40
|
||||
GRAPH_CONTENTOFFSET_X = 40
|
||||
GRAPH_CONTENTOFFSET_Y = 40
|
||||
GRAPH_PSPAN = 20
|
||||
GRAPH_BSPAN = 20
|
||||
GRAPH_LAYER_SPAN = 100
|
||||
GRAPH_BB_SPAN = 50
|
||||
GRAPH_LAYER_SPAN = 50
|
||||
GRAPH_BB_SPAN = 25
|
||||
|
||||
BB_POFFSET = 20
|
||||
BB_BOFFSET = 10
|
||||
|
@ -18,6 +16,9 @@ BB_PBSIZE = 6
|
|||
CELL_WIDTH = 15
|
||||
CELL_HEIGHT = 5
|
||||
|
||||
GRAPH_CONTENTOFFSET_X = 40
|
||||
GRAPH_CONTENTOFFSET_Y = 40
|
||||
|
||||
|
||||
class LinkType(object):
|
||||
PLOCAL = 0
|
||||
|
@ -54,3 +55,26 @@ class BBResult(object):
|
|||
|
||||
self.width = max(wp, wText)
|
||||
self.height = max(hb, hText)
|
||||
|
||||
class pOperArrangement(object):
|
||||
def __init__(self, attachedBB, sublayer):
|
||||
self.attachedBB = attachedBB
|
||||
self.sublayer = sublayer
|
||||
|
||||
class OperResult(object):
|
||||
def __init__(self, name, x):
|
||||
self.name = name
|
||||
self.x = x
|
||||
self.y = 0.0
|
||||
self.height = 0.0
|
||||
self.width = 0.0
|
||||
|
||||
def computSize(self):
|
||||
wText = len(self.name) * FONT_SIZE
|
||||
hText = FONT_SIZE * 4
|
||||
|
||||
wp = 2 * BB_POFFSET + 2 * (BB_PBSIZE + BB_PSPAN)
|
||||
hb = 2 * BB_BOFFSET + 0 * (BB_PBSIZE + BB_BSPAN)
|
||||
|
||||
self.width = max(wp, wText)
|
||||
self.height = max(hb, hText)
|
||||
|
|
|
@ -19,7 +19,7 @@ def run():
|
|||
|
||||
# decorate each graph
|
||||
for i in graphList:
|
||||
buildBBTree(exportCur, decorateCur, i)
|
||||
(plocal_layer, bbMap, operMap) = buildBB(exportCur, decorateCur, i)
|
||||
|
||||
# give up all change of eexport.db (because no change)
|
||||
exportDb.close()
|
||||
|
@ -27,12 +27,12 @@ def run():
|
|||
decorateDb.close()
|
||||
|
||||
def initDecorateDb(cur):
|
||||
cur.execute("CREATE TABLE graph([graph] INTEGER, [width] INTEGER, [height] INTEGER, [index] INTEGER, [belong_to] TEXT);")
|
||||
cur.execute("CREATE TABLE graph([graph] INTEGER, [graph_name] TEXT, [width] INTEGER, [height] INTEGER, [index] INTEGER, [belong_to] TEXT);")
|
||||
cur.execute("CREATE TABLE info([target] INTEGER, [field] TEXT, [data] TEXT);")
|
||||
|
||||
cur.execute("CREATE TABLE block([belong_to_graph] INETGER, [thisobj] INTEGER, [name] TEXT, [assist_text] TEXT, [pin-pin] INTEGER, [pin-pout] INTEGER, [pin-bin] INTEGER, [pin-bout] INTEGER, [x] INTEGER, [y] INTEGER, [width] INTEGER, [height] INTEGER, [expandable] INTEGER);")
|
||||
cur.execute("CREATE TABLE cell([belong_to_graph] INETGER, [thisobj] INTEGER, [name] TEXT, [assist_text] TEXT, [x] INTEGER, [y] INTEGER, [type] INTEGER);")
|
||||
cur.execute("CREATE TABLE link([belong_to_graph] INETGER, [thisobj] INTEGER, [delay] INTEGER, [startobj] INTEGER, [endobj] INTEGER, [start_index] INTEGER, [end_index] INTEGER, [x1] INTEGER, [y1] INTEGER, [x2] INTEGER, [y2] INTEGER);")
|
||||
cur.execute("CREATE TABLE block([belong_to_graph] INETGER, [thisobj] INTEGER, [name] TEXT, [assist_text] TEXT, [pin-pin] INTEGER, [pin-pout] INTEGER, [pin-bin] INTEGER, [pin-bout] INTEGER, [x] REAL, [y] REAL, [width] REAL, [height] REAL, [expandable] INTEGER);")
|
||||
cur.execute("CREATE TABLE cell([belong_to_graph] INETGER, [thisobj] INTEGER, [name] TEXT, [assist_text] TEXT, [x] REAL, [y] REAL, [type] INTEGER);")
|
||||
cur.execute("CREATE TABLE link([belong_to_graph] INETGER, [thisobj] INTEGER, [delay] INTEGER, [startobj] INTEGER, [endobj] INTEGER, [start_index] INTEGER, [end_index] INTEGER, [x1] REAL, [y1] REAL, [x2] REAL, [y2] REAL);")
|
||||
|
||||
def decorateGraph(exCur, deCur, graph):
|
||||
scriptMap = {}
|
||||
|
@ -44,7 +44,7 @@ def decorateGraph(exCur, deCur, graph):
|
|||
break
|
||||
scriptMap[lines[0]] = (lines[1], lines[2])
|
||||
|
||||
exCur.execute("SELECT [thisobj], [type] FROM behavior WHERE [type] != 0;")
|
||||
exCur.execute("SELECT [thisobj], [type], [name] FROM behavior WHERE [type] != 0;")
|
||||
while True:
|
||||
lines = exCur.fetchone()
|
||||
if lines == None:
|
||||
|
@ -57,41 +57,83 @@ def decorateGraph(exCur, deCur, graph):
|
|||
# statement to change it
|
||||
if lines[1] == 1:
|
||||
# script
|
||||
deCur.execute("INSERT INTO graph VALUES(?, 0, 0, ?, ?)", (lines[0], scriptMap[lines[0]][0], scriptMap[lines[0]][1]))
|
||||
deCur.execute("INSERT INTO graph VALUES(?, ?, 0, 0, ?, ?)", (lines[0], lines[2], scriptMap[lines[0]][0], scriptMap[lines[0]][1]))
|
||||
else:
|
||||
# sub bb
|
||||
deCur.execute("INSERT INTO graph VALUES(?, 0, 0, -1, '')", (lines[0],))
|
||||
deCur.execute("INSERT INTO graph VALUES(?, ?, 0, 0, -1, '')", (lines[0], lines[2]))
|
||||
|
||||
def buildBBTree(exCur, deCur, target):
|
||||
def buildBB(exCur, deCur, target):
|
||||
# sort inner bb
|
||||
# use current graph input as the start point
|
||||
treeRoot = dcv.BBTreeNode(target, -1)
|
||||
processedBB = set()
|
||||
bb_layer_map = {}
|
||||
# layer start from 1, 0 is occupied for pLocal
|
||||
arrangedLayer = recursiveBuildBBTree(treeRoot, exCur, deCur, processedBB, 1, 0, target)
|
||||
# layer start from 2, 0 is occupied for pLocal, 1 is occupied for pOper
|
||||
arrangedLayer = recursiveBuildBBTree(treeRoot, exCur, deCur, processedBB, 2, 0, target)
|
||||
|
||||
# get no linked bb and place them. linked bb position will be computed following
|
||||
# calc each bb's x postion, as for y, we need wait for oOper to confirm each layer's height
|
||||
# calc each bb's x postion, as for y, calc later
|
||||
arrangedLayer+=1
|
||||
singleBB = set()
|
||||
bbResult = {}
|
||||
bb_layer_map = {}
|
||||
baseX = dcv.GRAPH_CONTENTOFFSET_X
|
||||
exCur.execute('SELECT [thisobj], [name], [type], [proto_name], [pin_count] FROM behavior WHERE parent == ?', (target, ))
|
||||
for i in exCur.fetchall():
|
||||
pinSplit = i[4].split(',')
|
||||
bbCache = dcv.BBResult(i[1], i[3], pinSplit[0], pinSplit[1], pinSplit[2], pinSplit[3], (i[0] if i[2] != 0 else -1))
|
||||
bbCache = dcv.BBResult(i[1], i[3], pinSplit[1], pinSplit[2], pinSplit[3], pinSplit[4], (i[0] if i[2] != 0 else -1))
|
||||
bbCache.computSize()
|
||||
if i[0] not in processedBB:
|
||||
# single bb, process it
|
||||
singleBB.add(i[0])
|
||||
bbCache.x = baseX
|
||||
baseX += bbCache.width + dcv.GRAPH_BB_SPAN
|
||||
bb_layer_map[i[0]] = arrangedLayer
|
||||
|
||||
bbResult[i[0]] = bbCache
|
||||
|
||||
recursiveCalcBBX(treeRoot, dcv.GRAPH_CONTENTOFFSET_X, bbResult)
|
||||
pass
|
||||
recursiveCalcBBX(treeRoot, dcv.GRAPH_CONTENTOFFSET_X, bbResult, bb_layer_map)
|
||||
|
||||
# calc bb y
|
||||
layer_height = {}
|
||||
layer_y = {}
|
||||
layer_height[0] = 25
|
||||
layer_height[1] = 50
|
||||
for i in bb_layer_map.keys():
|
||||
curLayer = bb_layer_map[i]
|
||||
if curLayer not in layer_height.keys():
|
||||
layer_height[curLayer] = bbResult[i].height
|
||||
else:
|
||||
layer_height[curLayer] = max(layer_height.get(curLayer, 0), bbResult[i].height)
|
||||
layer_height[arrangedLayer] = layer_height.get(arrangedLayer, 0) # make sure misc bb height exist
|
||||
baseY = dcv.GRAPH_CONTENTOFFSET_Y
|
||||
for i in range(arrangedLayer + 1):
|
||||
baseY += layer_height[i] + dcv.GRAPH_LAYER_SPAN
|
||||
layer_y[i] = baseY
|
||||
for i in bbResult.keys():
|
||||
cache = bbResult[i]
|
||||
layer = bb_layer_map[i]
|
||||
cache.y = layer_y[layer] - layer_height[layer] + cache.height
|
||||
|
||||
# calc poper
|
||||
operResult = {}
|
||||
baseX = dcv.GRAPH_CONTENTOFFSET_X
|
||||
exCur.execute('SELECT [thisobj], [op] FROM pOper WHERE [belong_to] == ?', (target, ))
|
||||
for i in exCur.fetchall():
|
||||
cache = dcv.OperResult(i[1], baseX)
|
||||
cache.computSize()
|
||||
baseX += cache.width + dcv.GRAPH_BB_SPAN
|
||||
cache.y = layer_y[1] - cache.height
|
||||
operResult[i[0]] = cache
|
||||
|
||||
# write to database and return
|
||||
for i in bbResult.keys():
|
||||
cache = bbResult[i]
|
||||
deCur.execute('INSERT INTO block VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (target, i, cache.name, cache.assistName, cache.pin, cache.pout, cache.bin, cache.bout, cache.x, cache.y, cache.width, cache.height, cache.expandable))
|
||||
for i in operResult.keys():
|
||||
cache = operResult[i]
|
||||
deCur.execute("INSERT INTO block VALUES (?, ?, ?, '', 2, 1, 0, 0, ?, ?, ?, ?, -1)", (target, i, cache.name, cache.x, cache.y, cache.width, cache.height))
|
||||
|
||||
return (layer_y[0] - dcv.CELL_HEIGHT, bbResult, operResult)
|
||||
|
||||
def recursiveBuildBBTree(node, exCur, deCur, processedBB, layer, depth, graphId):
|
||||
cache = []
|
||||
|
@ -148,12 +190,12 @@ def recursiveBuildBBTree(node, exCur, deCur, processedBB, layer, depth, graphId)
|
|||
|
||||
return layer
|
||||
|
||||
|
||||
def recursiveCalcBBX(node, baseX, resultList):
|
||||
def recursiveCalcBBX(node, baseX, resultList, layerMap):
|
||||
maxExpand = 0
|
||||
for i in node.nodes:
|
||||
layerMap[i.bb] = i.layer
|
||||
resultList[i.bb].x = baseX
|
||||
maxExpand = max(maxExpand, resultList[i.bb].width)
|
||||
|
||||
for i in node.nodes:
|
||||
recursiveCalcBBX(i, baseX + maxExpand + dcv.GRAPH_BB_SPAN, resultList)
|
||||
recursiveCalcBBX(i, baseX + maxExpand + dcv.GRAPH_BB_SPAN, resultList, layerMap)
|
||||
|
|
|
@ -1 +1,68 @@
|
|||
from flask import Flask
|
||||
from flask import g
|
||||
from flask import render_template
|
||||
from flask import url_for
|
||||
from flask import request
|
||||
|
||||
import sqlite3
|
||||
import ServerStruct as ss
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
def get_db():
|
||||
db = getattr(g, '_database', None)
|
||||
if db is None:
|
||||
db = g._database = sqlite3.connect('decorate.db')
|
||||
return db
|
||||
|
||||
@app.teardown_appcontext
|
||||
def close_connection(exception):
|
||||
db = getattr(g, '_database', None)
|
||||
if db is not None:
|
||||
db.close()
|
||||
|
||||
@app.route('/', methods=['GET'])
|
||||
def indexHandle():
|
||||
cur = get_db().cursor()
|
||||
cur.execute("SELECT [graph], [graph_name], [belong_to] FROM graph WHERE [index] != -1 ORDER BY [belong_to], [index] ASC;")
|
||||
data = {}
|
||||
for i in cur.fetchall():
|
||||
if i[2] not in data.keys():
|
||||
data[i[2]] = [ss.ScriptItem(i[1], i[0])]
|
||||
else:
|
||||
data[i[2]].append(ss.ScriptItem(i[1], i[0]))
|
||||
|
||||
return render_template('index.html', scripts = data)
|
||||
|
||||
@app.route('/<path:scriptPath>', methods=['GET'])
|
||||
def scriptHandle(scriptPath):
|
||||
# comput hamburger
|
||||
pathSlice = scriptPath.split('/')
|
||||
cur = get_db().cursor()
|
||||
cur.execute("SELECT [graph], [graph_name] FROM graph WHERE [graph] IN ({});".format(','.join(pathSlice)))
|
||||
hamburgerMap = {}
|
||||
hamburger = []
|
||||
for i in cur.fetchall():
|
||||
hamburgerMap[i[0]] = i[1]
|
||||
for i in pathSlice:
|
||||
hamburger.append(hamburgerMap[int(i)])
|
||||
currentHamburger = hamburger.pop()
|
||||
|
||||
# get blocks
|
||||
cur.execute('SELECT * FROM block WHERE [belong_to_graph] = ?', (pathSlice[-1],))
|
||||
dbBlocks = cur.fetchall()
|
||||
|
||||
# todo:xxxxx
|
||||
|
||||
# render
|
||||
return render_template('viewer.html',
|
||||
hamburgerHistory = hamburger,
|
||||
static_css = url_for('static', filename='site.css'),
|
||||
static_js = url_for('static', filename='site.js'),
|
||||
hamburgerCurrent = currentHamburger,
|
||||
blocks = dbBlocks)
|
||||
|
||||
def run():
|
||||
app.run()
|
||||
|
||||
|
||||
|
|
4
SuperScriptViewer/ServerStruct.py
Normal file
4
SuperScriptViewer/ServerStruct.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
class ScriptItem(object):
|
||||
def __init__(self, name, id):
|
||||
self.name = name
|
||||
self.id = id
|
|
@ -1,10 +1,10 @@
|
|||
import DecoratorCore
|
||||
import ServerCore
|
||||
import os
|
||||
import sys
|
||||
|
||||
# debug use
|
||||
os.remove('decorate.db')
|
||||
|
||||
# os.remove('decorate.db')
|
||||
|
||||
print('Super Script View')
|
||||
if not os.path.isfile("decorate.db"):
|
||||
|
@ -18,3 +18,4 @@ if not os.path.isfile("decorate.db"):
|
|||
print('Decorated database generating done.')
|
||||
|
||||
# todo: start flask
|
||||
ServerCore.run()
|
||||
|
|
|
@ -30,6 +30,9 @@
|
|||
<Compile Include="ServerCore.py">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ServerStruct.py">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="SuperScriptViewer.py" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets" />
|
||||
|
|
26
SuperScriptViewer/static/site.css
Normal file
26
SuperScriptViewer/static/site.css
Normal file
|
@ -0,0 +1,26 @@
|
|||
p.hamburger {
|
||||
margin: 0 5px 0 5px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.block-b {
|
||||
position: absolute;
|
||||
background: yellow;
|
||||
}
|
||||
|
||||
div.block-p {
|
||||
position: absolute;
|
||||
background: blue;
|
||||
}
|
||||
|
||||
p.block-text {
|
||||
position: absolute;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.block-body {
|
||||
position: absolute;
|
||||
background: #8f8f8f;
|
||||
border: 1px solid #cfcfcf;
|
||||
}
|
0
SuperScriptViewer/static/site.js
Normal file
0
SuperScriptViewer/static/site.js
Normal file
|
@ -11,27 +11,14 @@
|
|||
<p>Choose a script to read it.</p>
|
||||
<br />
|
||||
<br />
|
||||
<h2>MfObj</h2>
|
||||
{% for key, value in scripts.items() %}
|
||||
<h2>{{ key|e }}</h2>
|
||||
<ol>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
</ol>
|
||||
<h2>MfObj</h2>
|
||||
<ol>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
</ol>
|
||||
<h2>MfObj</h2>
|
||||
<ol>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
<li><a href="">shit</a></li>
|
||||
{% for i in value %}
|
||||
<li><a href="{{ "./%s"|format(i.id) }}">{{ i.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% endfor %}
|
||||
|
||||
</body>
|
||||
|
||||
|
|
|
@ -4,25 +4,23 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Script Viewer</title>
|
||||
<link rel="stylesheet" href="{{static_css}}">
|
||||
<script src="{{static_js}}"></script>
|
||||
</head>
|
||||
|
||||
<body style="display: flex; flex-flow: column; height: 100%; width: 100%; margin: 0; padding: 0;">
|
||||
<div style="display: flex; background: #cfcfcf; flex-flow: row; width: 100%; height: 50px;">
|
||||
<div style="display: flex; flex-flow: row; width: 100%; height: 100%; overflow: scroll;">
|
||||
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><a href=""><b>Script Hierarchy</b></a></p>
|
||||
<p class="hamburger"><a href="/"><b>Script Hierarchy</b></a></p>
|
||||
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;">>></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><a href="">Base BB 1</a></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;">>></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><a href="">Base BB 1</a></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;">>></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><a href="">Base BB 1</a></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;">>></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><a href="">Base BB 1</a></p>
|
||||
{% for i in hamburgerHistory %}
|
||||
<p class="hamburger">>></p>
|
||||
<p class="hamburger"><a href="{{ "../" * loop.revindex }}">{{ i|e }}</a></p>
|
||||
{% endfor %}
|
||||
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;">>></p>
|
||||
<p style="margin: 0 5px 0 5px; padding: 0;"><b>Current BB</b></p>
|
||||
<p class="hamburger">>></p>
|
||||
<p class="hamburger"><b>{{ hamburgerCurrent|e }}</b></p>
|
||||
|
||||
</div>
|
||||
<div style="width: 100px;">
|
||||
|
@ -31,18 +29,26 @@
|
|||
</div>
|
||||
<div style="background: #7f7f7f; width: 100%; height: 100%; overflow: scroll; position: relative;">
|
||||
<div>
|
||||
<div
|
||||
style="position: absolute; height: 50px; width: 200px; top: 200px; left: 300px; background: #8f8f8f; border: 1px solid #cfcfcf;">
|
||||
<div style="position: absolute; height: 6px; width: 6px; top: 0; left: 20px; background: blue;"></div>
|
||||
<div style="position: absolute; height: 6px; width: 6px; top: 0; left: 35px; background: blue;"></div>
|
||||
<div style="position: absolute; height: 6px; width: 6px; bottom: 0; left: 20px; background: blue;">
|
||||
{% for i in blocks %}
|
||||
<div class="block-body" style="height: {{ i[11] }}px; width: {{ i[10] }}px; top: {{ i[9] }}px; left: {{ i[8] }}px;">
|
||||
{% for pin in range(i[4]) %}
|
||||
<div class="block-p" style="height: 6px; width: 6px; top: 0; left: {{ 20 + pin * ( 6 + 20) }}px;"></div>
|
||||
{% endfor %}
|
||||
{% for pout in range(i[5]) %}
|
||||
<div class="block-p" style="height: 6px; width: 6px; bottom: 0; left: {{ 20 + pout * ( 6 + 20) }}px;"></div>
|
||||
{% endfor %}
|
||||
{% for bin in range(i[6]) %}
|
||||
<div class="block-b" style="height: 6px; width: 6px; top: {{ 10 + bin * ( 6 + 20) }}px; left: 0;"></div>
|
||||
{% endfor %}
|
||||
{% for bout in range(i[6]) %}
|
||||
<div class="block-b" style="height: 6px; width: 6px; top: {{ 10 + bout * ( 6 + 20) }}px; right: 0;"></div>
|
||||
{% endfor %}
|
||||
|
||||
<p class="block-text" style="top: 10px; left: 20px;">{{ i[2]|e }}</p>
|
||||
<p class="block-text" style="top: 24px; left: 20px;"><i>{{ i[3]|e }}</i></p>
|
||||
</div>
|
||||
<div style="position: absolute; height: 6px; width: 6px; top: 10px; left: 0; background: yellow;"></div>
|
||||
<div style="position: absolute; height: 6px; width: 6px; top: 10px; right: 0; background: yellow;">
|
||||
</div>
|
||||
<p style="position: absolute; top: 10px; left: 10px; margin: 0; padding: 0;">Get Cell</p>
|
||||
</div>
|
||||
<svg version="1.1" width="1000px" height="1000px" style="position: absolute; top: 0; left: 0;">
|
||||
{% endfor %}
|
||||
<svg version="1.1" width="5000px" height="5000px" style="position: absolute; top: 0; left: 0;">
|
||||
<line x1="502" y1="210" x2="100" y2="100" stroke="black" stroke-width="1px"></line>
|
||||
<line x1="320" y1="200" x2="100" y2="100" stroke="blue" stroke-width="1px" stroke-dasharray="10, 5">
|
||||
</line>
|
||||
|
|
Loading…
Reference in New Issue
Block a user