I concur with Tom on the Student Version drawings. However, you can still automate a lot of these steps.
I would first create the template drawing containing this CROSS block used by your surveyor. In that template, modify the CROSS block to fit your desired output. I would add three ATTRIBUTE DEFINITIONS to the block with each mimicking the text provided by the surveyor in your desired height and the layer the text is currently on. For the HEIGHT attribute, I would add a block placeholder for the Z coordinate with the appropriate precision. For the CO_ORD attribute, I would do the same for the X and Y coordinates with similar precision. Once you have that you can continue to the automation.
Using your template, INSERT and EXPLODE your surveyor's drawing. This will make your CROSS block take precedence over the surveyor's block. All of the surveyor's CROSS blocks will be rewritten to match your CROSS block definition. You would then use the ATTSYNC command to update the location labels for the block.
Once the surveyor's drawing is inserted and exploded, you can use the SSGET AutoLISP function to create a selection set of different elements from the drawing by providing filters to the function. With this function, you can select elements from the entire drawing database. I would do this once for the ID text, and then once for all of the CROSS block INSERT locations.
REPEATing through each selection set and append each element to a list. Properties of these elements that would be helpful could be the entity's handle (group code 5) and the insertion point of the block (group code 10) or the text attachment point (group code 11). Once you have two lists continue to the next step.
Let's run through the list containing the TEXT elements. We can do this using the FOREACH AutoLISP function. Inside this FOREACH loop, let's run through the BLOCK element list using another FOREACH loop. Inside the BLOCK FOREACH loop, we need to compare the coordinates between the text and the block insertion point. Unfortunately, the coordinates do not exactly match, but are close. To get around this, we can use the EQUAL AutoLISP function with a fuzz factor. If the coordinates match, then do something.
In this something branch of the IF statement, we should probably do a bunch of steps. To do that in an IF statement in AutoLISP, you would need to wrap all of those steps in a PROGN function. The first step in this group of steps in the true leg of the IF/PROGN statement, we should update the ID attribute of the CROSS block we created earlier. You can use
PutBlkAttribute routine found in this post found in the forums here. This routine requires you to provide the block or entity. Here you could provide the entity name by retrieving it with the HANDENT AutoLISP function. We would get this from the current element being reviewed in the BLOCK FOREACH list. The other parameters of the PutBlkAttribute routine would be the attribute name we defined earlier, probably ID, and then the value of the attribute. That would be the text value (group code 1) of the current element being reviewed in the TEXT FOREACH list.
The next step would be deleting the TEXT element from the text list. Doing so in the FOREACH loop may cause issues, therefore, I would recommend appending the handle of the TEXT element to a new list. We can then process this new list after we complete the attribute updating.
Another step would be putting the block insertion on the layer you desired. We can evaluate the text value for the ID to either create or verify the desired layer exists. If the layer exists, then set the layer (group code
for the block to the desired layer.
You will probably be done with that group of FOREACH loops by now, so you could then delete the text using another FOREACH loop on the new list we created.
Your code you posted earlier to draw lines could be modified to cycle through the layers and connected the insertion points of the blocks.