如何使用 Altium 脚本系统删除 Altium PCB 库中的 PCB 对象?
How can I remove a PCB Object in Altium PCB Library using Altium scripting systems?
我正在编写一个 Delphi Altium 脚本来删除 PCB 库中 TopOverLay 中的所有轨道。
虽然 运行 脚本没有任何反应(曲目未被删除)。
我不知道为什么。你能帮帮我吗?
下面是我的代码:
procedure RemoveTrackObject;
Var
MyComponent : IPCB_LibComponent;
MyTrack : IPCB_Track;
Iterator : IPCB_GroupIterator;
DeleteList : TInterfaceList;
TrackTemp : IPCB_Track;
i : Integer;
begin
MyComponent := PCBServer.GetCurrentPCBLibrary.CurrentComponent;
//////////////////////////////////////////////////////////////////////
Iterator := MyComponent.GroupIterator_Create;
Iterator.AddFilter_ObjectSet(Mkset(eTrackObject));
Iterator.AddFilter_LayerSet(Mkset(eTopOverLay));
DeleteList := TInterfaceList.Create;
try
MyTrack := Iterator.FirstPCBObject;
While MyTrack <> nil do
begin
DeleteList.Add(MyTrack);
MyTrack := Iterator.NextPCBObject;
end;
finally
MyComponent.GroupIterator_Destroy(Iterator);
end;
try
PCBServer.PreProcess;
for i := 0 to DeleteList.Count - 1 do
begin
TrackTemp := DeleteList.Items[i];
MyComponent.RemovePCBObject(TrackTemp);
end;
finally
PCBServer.PostProcess;
DeleteList.Free;
end;
Client.SendMessage('PCB:Zoom', 'Action=Redraw' , 255, Client.CurrentView);
end;
AFAIU 在 Altium dephiscript API InterfaceList 中有特定用途:保存 non-PCB 对象并传递给外部 dll 函数并让接收 fn 销毁列表。
你真的不需要这里。
PcbLib 在从 selected/focused 足迹等中删除时确实有一些奇怪的行为。
我认为问题是由于 Pcb Editor 不允许从当前焦点中删除对象 component/footprint。
围绕此问题的历史指向涉及将焦点从所需组件移开的解决方案..
当列表仍包含对象引用时,您无法完成删除过程。
使用 While 循环,在 RemovePCBObject() 之后,从列表中删除对象引用(删除列表项)。然后,当 While 循环终止时,列表中的项目为零。
可能有助于刷新或使用其中一些 fn 调用的外观:
CurrentLib.Board.GraphicallyInvalidate;
CurrentLib.Navigate_FirstComponent;
CurrentLib.Board.ViewManager_FullUpdate;
CurrentLib.Board.GraphicalView_ZoomRedraw;
CurrentLib.RefreshView;
我正在编写一个 Delphi Altium 脚本来删除 PCB 库中 TopOverLay 中的所有轨道。
虽然 运行 脚本没有任何反应(曲目未被删除)。
我不知道为什么。你能帮帮我吗?
下面是我的代码:
procedure RemoveTrackObject;
Var
MyComponent : IPCB_LibComponent;
MyTrack : IPCB_Track;
Iterator : IPCB_GroupIterator;
DeleteList : TInterfaceList;
TrackTemp : IPCB_Track;
i : Integer;
begin
MyComponent := PCBServer.GetCurrentPCBLibrary.CurrentComponent;
//////////////////////////////////////////////////////////////////////
Iterator := MyComponent.GroupIterator_Create;
Iterator.AddFilter_ObjectSet(Mkset(eTrackObject));
Iterator.AddFilter_LayerSet(Mkset(eTopOverLay));
DeleteList := TInterfaceList.Create;
try
MyTrack := Iterator.FirstPCBObject;
While MyTrack <> nil do
begin
DeleteList.Add(MyTrack);
MyTrack := Iterator.NextPCBObject;
end;
finally
MyComponent.GroupIterator_Destroy(Iterator);
end;
try
PCBServer.PreProcess;
for i := 0 to DeleteList.Count - 1 do
begin
TrackTemp := DeleteList.Items[i];
MyComponent.RemovePCBObject(TrackTemp);
end;
finally
PCBServer.PostProcess;
DeleteList.Free;
end;
Client.SendMessage('PCB:Zoom', 'Action=Redraw' , 255, Client.CurrentView);
end;
AFAIU 在 Altium dephiscript API InterfaceList 中有特定用途:保存 non-PCB 对象并传递给外部 dll 函数并让接收 fn 销毁列表。 你真的不需要这里。
PcbLib 在从 selected/focused 足迹等中删除时确实有一些奇怪的行为。
我认为问题是由于 Pcb Editor 不允许从当前焦点中删除对象 component/footprint。 围绕此问题的历史指向涉及将焦点从所需组件移开的解决方案..
当列表仍包含对象引用时,您无法完成删除过程。
使用 While 循环,在 RemovePCBObject() 之后,从列表中删除对象引用(删除列表项)。然后,当 While 循环终止时,列表中的项目为零。
可能有助于刷新或使用其中一些 fn 调用的外观:
CurrentLib.Board.GraphicallyInvalidate;
CurrentLib.Navigate_FirstComponent;
CurrentLib.Board.ViewManager_FullUpdate;
CurrentLib.Board.GraphicalView_ZoomRedraw;
CurrentLib.RefreshView;