Add weld constraints into the circle (same amount as the parts), set their Part0 as the Center, and go through the other parts and one by one set the Part1 of a weld constraint to that part. If it helps you at all, here is the Roblox reference for it.
Yes, you would still be able to weld them. If you did it in a script, just make the weld within the script. Also, make sure that the weld is a WeldConstraint and not a Weld.
remember to tween infinitely, not use a while loop, that can cause some really bad optimization, to tween infinite make the delay time in tweeninfo (4th parameter) -1
local Circle = game.Workspace.Circle
while true do
Circle:PivotTo(Circle:GetPivot() * CFrame.Angles(0,0,math.rad(10)))
task.wait()
end
Let’s break the big part down.
Circle:PivotTo()
PivotTo is essentially the new SetPrimaryPartCFrame (except you don’t need a PrimaryPart, everything has a pivot), so if you’ve ever used that then you know (but if you don’t, it basically moves everything in the model relative to the PrimaryPart, and sets the PrimaryPart’s CFrame to the CFrame you give it)
Circle:GetPivot()
GetPivot is basically GetPrimaryPartCFrame, but you don’t need a PrimaryPart. It just gives you the CFrame of the Pivot.
CFrame.Angles(0,0,math.rad(10))
CFrame.Angles gives you a CFrame with the specified rotation. It’s taken in radians though, so you have to use math.rad() to convert degrees to radians.
After all that, you multiply them together (which is essentially addition in this scenario) and it gives you a new CFrame that is rotated 10 degrees on the Z-axis compared to the original CFrame. After all that, you set the model’s Pivot to the CFrame you just computed.