Copy link to clipboard
Copied
Hello there,
what I want to do is to iterate through all frames with pictures in my doc. While going through I want to save the file name of the picture in a variable, then delete the frame with the picture and append the file name of the picture to the end of the paragraph that was above the frame with the picture.
What I got so far is this:
var doc= app.ActiveDoc;
var count = 0;
var graphicPath;
CountGraphics(doc);
DeleteGraphics(doc);
//COUNT GRAPHICS
function CountGraphics(doc)
{
var graphic = doc.FirstGraphicInDoc;
while (graphic) {
if (graphic.type == Constants.FO_Inset) {
count++;
}
graphic = graphic.NextGraphicInDoc;
}
}
//DELETE GRAPHICS + FRAMES
function DeleteGraphics(doc)
{
for(i = 0; i < count; i++) {
var graphic = doc.FirstGraphicInDoc;
while (graphic) {
if (graphic.type == Constants.FO_Inset) {
graphicPath = graphic.InsetFile;
graphic.FrameParent.Delete();
}
graphic = graphic.NextGraphicInDoc;
}
}
}
This works so far for the saving file name and deleting of the frames.
What I am stuck on is the part to select the previous paragraph and go to the end of it to write the file name of the graphic to it.
So like within the the loop I want to catch the previous paragraph of the frame I am at at the moment.
Thought about something like "graphic.FrameParent.PrevPgfInFlow" or sth...
Thanks in advance for dealing with my stuff ^^°
Copy link to clipboard
Copied
I am pressed for time but I will give you this:
// Store the anchored frame's paragraph object.
pgf = frame.TextLoc.obj;
// Get the previous paragraph in the flow.
pgf = pgf.PrevPgfInFlow;
Copy link to clipboard
Copied
Assuming that "frame" is your anchored frame variable. It may be "graphic" or whatever else you specified.
Copy link to clipboard
Copied
Hi again.
I did some good progress with your help. I can now applay the graphic Path to the previous paragraph. However I am now trying to figure out how to apply it to the END of the paragraph. I know there is something like pgf.end/beg.
My solution so far:
function DeleteGraphics(doc)
{
var pgf;
var tl;
for(i = 0; i < countG; i++) {
var graphic = doc.FirstGraphicInDoc;
while (graphic) {
if (graphic.type == Constants.FO_Inset) {
graphicPath = graphic.InsetFile;
pgf = graphic.FrameParent.TextLoc.obj.PrevPgfInFlow;
tl = new TextLoc(pgf, 0);
doc.AddText(tl, "[GRAPHIC]: " + graphicPath);
graphic.FrameParent.Delete();
}
graphic = graphic.NextGraphicInDoc;
}
}
}
I don't know how to apply the END to the textloc.
Copy link to clipboard
Copied
By the way, great job in separating your tasks into functions.
Copy link to clipboard
Copied
Hi Rick,
I know that you like functions. However, isn't the first function superfluous?
You can omit the FOR in the second function. And you have the WHILE and the IF anyway.
Just out of curiosity so that I know what I can improve in my scripts.
Best regards
Winfried
Copy link to clipboard
Copied
Hi Rick,
I am not that happy with the functions either. But I tried to leave out the FOR and / or the WHILE in the second loop.
But then it only loops for one time (didn't really figure out why yet...). So I made a function to count the graphics first so that I can loop through x-times with a FOR loop.
Its working this way, but I am trying to find a more elegant way. But couldn't come up with one yet.
Copy link to clipboard
Copied
Sorry, I meant Winfried... (cant update my post?)
Copy link to clipboard
Copied
I would go a different way:
Remember: there can be more than one graphic in an frame.
That can be the reason, why your second loop doesn't work, because when you delete a frame with multiple graphics in it then NextGraphicInDoc won't work.
My way would be: gather all Frames with Insets in an array. Then delete these frames.
If one Frame contains multiple graphics I would gather their names in a string.
var oDoc, oGraphic, gaFrames=[];
var oGraphicObject;
oDoc = app.ActiveDoc;
if (oDoc.ObjectValid())
{
GatherGraphics(oDoc);
DeleteGraphics(oDoc);
}
else
{
alert("No active Document");
}
function GatherGraphics(doc)
{
var graphic = doc.FirstGraphicInDoc;
while (graphic)
{
if (graphic.type == Constants.FO_Inset)
{
gaFrames.push(graphic.FrameParent);
}
graphic = graphic.NextGraphicInDoc;
}
}
function DeleteGraphics(doc)
{
var pgf, sText="";
for(i = 0; i < gaFrames.length; i++)
{
sText = CreateText(gaFrames[i]);
pgf = gaFrames[i].TextLoc.obj.PrevPgfInFlow;
tl = new TextLoc(pgf, Constants.FV_OBJ_END_OFFSET-1);
doc.AddText(tl, "[GRAPHIC]: " + sText);
gaFrames[i].Delete();
}
}
function CreateText(fFrame)
{
var graphic = fFrame.FirstGraphicInFrame;
var sText = "";
var aText = [];
// if more than 1 Inset in 1 Frame
while (graphic.ObjectValid())
{
aText.push(graphic.InsetFile);
graphic = graphic.NextGraphicInFrame;
}
return sText = aText.join("--");
}